sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Server:dynamisk pivot over 5 kolonner

For at få resultatet skal du se på at fjerne pivotering af dataene i Total og Lydstyrke kolonner først, før du anvender PIVOT-funktionen for at få det endelige resultat. Mit forslag ville være først at skrive en hårdkodet version af forespørgslen og derefter konvertere den til dynamisk SQL.

UNPIVOT-processen konverterer disse flere kolonner til rækker. Der er et par måder at UNPIVOT på, du kan bruge UNPIVOT-funktionen eller du kan bruge CROSS APPLY. Koden til at fjerne pivoteringen af ​​dataene vil ligne:

vælg id, col =cast(t_year as varchar(4))+'_'+t_type+'_'+col, valuefrom ATM_TRANSACTIONS tcross apply( vælg 'total', total union all vælg 'volume', volumen) c (kol, værdi); 

Dette giver dig data i formatet:

+-----+---------------+-------+| id | col | værdi |+-----+--------------+-------+| DD1 | 2008_A_total | 1000 || DD1 | 2008_A_bind | 10 || DD1 | 2008_B_total | 2000 || DD1 | 2008_B_bind | 20 || DD1 | 2008_C_total | 3000 || DD1 | 2008_C_bind | 30 |+-----+---------------+-------+

Derefter kan du anvende PIVOT-funktionen:

vælg ID, [2008_A_total], [2008_A_volume], [2008_B_total], [2008_B_volume], [2008_C_total], [2008_C_volume], [2009_A_total], [2009_A_volumen]_from (vælg =år). som varchar(4))+'_'+t_type+'_'+col, værdi fra ATM_TRANSACTIONS t kryds gælder (vælg 'total', total union alle vælg 'volumen', volumen ) c (col, værdi)) dpivot( maks. (værdi) for col in ([2008_A_total], [2008_A_volume], [2008_B_total], [2008_B_volume], [2008_C_total], [2008_C_volume], [2009_A_total], [2009_A_volumen])>) piv; 

Nu hvor du har den rigtige logik, kan du konvertere denne til dynamisk SQL:

ERKLÆR @cols SOM NVARCHAR(MAX), @query AS NVARCHAR(MAX)vælg @cols =TING((SELECT ',' + QUOTENAME(cast(t_year as varchar(4))+'_'+ t_type+'_'+col) fra ATM_TRANSACTIONS t kryds gælder (vælg 'total', 1 union alle vælg 'volumen', 2 ) c (col, so) grupper efter col, så, T_TYPE, T_YEAR rækkefølge efter T_YEAR, T_TYPE, så FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')sæt @query ='SELECT id,' + @cols + ' from ( vælg id , col =cast(t_year as varchar(4))+''_''+t_type+''_''+col, værdi fra ATM_TRANSACTIONS t kryds gælder (vælg ''total'', total union alle vælg ''volumen' ', volumen ) c (kol., værdi) ) x pivot ( max(værdi) for col in (' + @cols + ') ) p 'execute sp_executesql @query; 

Dette vil give dig et resultat:

+-----+---------------------+------ ----------------------+--------------+-------- -----+--------------+------------------- --+---------------+--------------+--------+| id | 2008_A_total | 2008_A_bind | 2008_B_total | 2008_B_bind | 2008_C_total | 2008_C_bind | 2009_A_total | 2009_A_bind | 2009_B_total | 2009_B_bind | 2009_C_total | 2009_C_volume |+-----+-------------------+------ ----+---------------+------------------- --+--------------+---------------+--------+-- --------------+--------------+---------------+| DD1 | 1000 | 10 | 2000 | 20 | 3000 | 30 | 4000 | 40 | 5000 | 50 | 6000 | 60 || DD2 | 7000 | 70 | 8000 | 80 | 9000 | 90 | 10000 | 100 | 11000 | 110 | 1200 | 120 |+-----+--------------+--------+-------- ----+---------------+------------------- --+--------------+---------------+--------+-- --------------+---------------+---------------+

  1. Sammenlign fire førende database-IDE-værktøjer

  2. Hvornår vælger du opdateringslås og oplåsning?

  3. TRIGGERE, der får INSERT'er til at fejle? Muligt?

  4. postgresql duplikatnøgle overtræder unik begrænsning