none
aiuto scrittura query pivot(forse pivot) - sqlserver 2005 RRS feed

  • Domanda

  • non so se con l'operatore pivot è possibile scrivere una query di questo tipo, in ogni modo avrei bisogno di un'aiuto con la sintassi perche non riesco proprio a farla


    questa è la mia tabella (per ogni targa ho massimo 8 righe, mai di piu ma posso averne anche meno)

    targa   | codice | importo

    AB22234 |  XX1   |   100  
    AB22234 |  XX2   |   200  
    AB22234 |  XX3   |   300  
    AB22234 |  XX4   |   100  
    AB22234 |  XX5   |   100  
    AB22234 |  XX6   |   300  
    AB22234 |  XX7   |   100  
    AB22234 |  XX8   |   100  
    DF335TT |  YY1   |   200  
    DF335TT |  YY2   |   200  

    vorrei ottenere un risultato del genere:
    ribaltare i campi (codice, importo) in orizzontale - (anche un'esempio con solo il campo codice ribaltato in orizzontale sarebbe ben gradito :-) raggruppando cmq per targa


    targa   | codice1 | importo1 | codice2 | importo2 | codice3 | importo3 | ......... codice8 | importo8  

    AB22234 |   XX1   |   100    |   xx2   |    200   |   xx3   |    300   | ..........  xx8   |    100
    DF335TT |   YY2   |   200    |   YY2   |    200   |   NULL  |    NULL  | ..........  NULL  |    NULL

    cmq i campi codice e importo devono essere sempre 8 (possono essere anche vuoti), non c'e' da fare nessuna somma o conteggio su un'aggregazione ma ho solo bisogno di ribaltare le

    righe in colonne, potreste darmi una mano? grazie infinitamente


    una'altra cosa:  non riesco a creare uno script per esportare la tabella di esempio con le relative insert per rendervi piu agevole la ricostruzione della tabella con i dati

    all'interno.
    Il management studio consente di farlo? riesco solo a creare lo script "create table" ma non so come estrapolare le insert con i dati, c'e' qualche altro strumento fornito con

    sqlserver 2005 che consente di farlo?(di creare un vero e proprio dump dei dati)

    spero di essere stato sufficentemente chiaro, grazie ancora

    lunedì 30 aprile 2012 13:19

Risposte

  • vorrei ottenere un risultato del genere:

    ribaltare i campi (codice, importo) in orizzontale - (anche un'esempio con solo il campo codice ribaltato in orizzontale sarebbe ben gradito :-) raggruppando cmq per targa


    targa   | codice1 | importo1 | codice2 | importo2 | codice3 | importo3 | ......... codice8 | importo8  

    AB22234 |   XX1   |   100    |   xx2   |    200   |   xx3   |    300   | ..........  xx8   |    100
    DF335TT |   YY2   |   200    |   YY2   |    200   |   NULL  |    NULL  | ..........  NULL  |    NULL

    cmq i campi codice e importo devono essere sempre 8 (possono essere anche vuoti), non c'e' da fare nessuna somma o conteggio su un'aggregazione ma ho solo bisogno di ribaltare le

    righe in colonne, potreste darmi una mano? grazie infinitamente

    Ciao,

    L'operatore pivot non permette di traslare due colonne pertanto puoi utilizzare il vecchio sistema basato sulla funzione CASE:

    USE tempdb;
    
    CREATE TABLE dbo.foo(
    targa char(7) NOT NULL,
    codice char(3) NOT NULL,
    importo int NOT NULL
    );
    
    INSERT dbo.foo
    VALUES ('AB22234', 'XX1', 100)
         , ('AB22234', 'XX2', 200)
         , ('AB22234', 'XX3', 300)
         , ('AB22234', 'XX4', 100)
         , ('AB22234', 'XX5', 100)
         , ('AB22234', 'XX6', 300)
         , ('AB22234', 'XX7', 100)
         , ('AB22234', 'XX8', 100)
         , ('DF335TT', 'YY1', 200)
         , ('DF335TT', 'YY2', 200);
    
    SET ANSI_WARNINGS OFF;
    
    WITH CTE_Data(targa, codice, importo, col) AS
    (
        SELECT
              targa
            , codice
            , importo
            , ROW_NUMBER() OVER(PARTITION BY targa ORDER BY targa, codice)
        FROM dbo.foo
    ) 
    SELECT
          targa
        , MAX(CASE col
            WHEN 1 THEN codice
            ELSE NULL
          END) AS codice1
        , MAX(CASE col
            WHEN 1 THEN importo
            ELSE NULL
          END) AS importo1
        , MAX(CASE col
            WHEN 2 THEN codice
            ELSE NULL
          END) AS codice2
        , MAX(CASE col
            WHEN 2 THEN importo
            ELSE NULL
          END) AS importo2
        , MAX(CASE col
            WHEN 3 THEN codice
            ELSE NULL
          END) AS codice3
        , MAX(CASE col
            WHEN 3 THEN importo
            ELSE NULL
          END) AS importo3
        , MAX(CASE col
            WHEN 4 THEN codice
            ELSE NULL
          END) AS codice4
        , MAX(CASE col
            WHEN 4 THEN importo
            ELSE NULL
          END) AS importo4
        , MAX(CASE col
            WHEN 5 THEN codice
            ELSE NULL
          END) AS codice5
        , MAX(CASE col
            WHEN 5 THEN importo
            ELSE NULL
          END) AS importo5
        , MAX(CASE col
            WHEN 6 THEN codice
            ELSE NULL
          END) AS codice6
        , MAX(CASE col
            WHEN 6 THEN importo
            ELSE NULL
          END) AS importo6
        , MAX(CASE col
            WHEN 7 THEN codice
            ELSE NULL
          END) AS codice7
        , MAX(CASE col
            WHEN 7 THEN importo
            ELSE NULL
          END) AS importo7
        , MAX(CASE col
            WHEN 8 THEN codice
            ELSE NULL
          END) AS codice8
        , MAX(CASE col
            WHEN 8 THEN importo
            ELSE NULL
          END) AS importo8
    FROM CTE_Data
    GROUP BY targa
    ORDER BY targa;
    
    /* Output:
    
    targa   codice1 importo1    codice2 importo2    codice3 importo3    codice4 importo4    codice5 importo5    codice6 importo6    codice7 importo7    codice8 importo8
    ------- ------- ----------- ------- ----------- ------- ----------- ------- ----------- ------- ----------- ------- ----------- ------- ----------- ------- -----------
    AB22234 XX1     100         XX2     200         XX3     300         XX4     100         XX5     100         XX6     300         XX7     100         XX8     100
    DF335TT YY1     200         YY2     200         NULL    NULL        NULL    NULL        NULL    NULL        NULL    NULL        NULL    NULL        NULL    NULL
    
    (2 row(s) affected)
    
    */
    
    DROP TABLE dbo.foo;

    una'altra cosa:  non riesco a creare uno script per esportare la tabella di esempio con le relative insert per rendervi piu agevole la ricostruzione della tabella con i datiall'interno.

    Il management studio consente di farlo?

    Certo, seleziona il db che contiene la tabella in questione, tasto DX, Tasks > "Generate Scripts..." e nelle opzioni avanzate alla voce "Types of data to script" seleziona "Schema and data".

    Ciao!


    Lorenzo Benaglia
    http://blogs.dotnethell.it/lorenzo
    http://social.technet.microsoft.com/Forums/it-IT/sqlserverit

    • Contrassegnato come risposta poioio mercoledì 2 maggio 2012 13:43
    lunedì 30 aprile 2012 19:29
    Moderatore