2013-04-19 4 views
-2

J'ai requête comme ceci:de commutation des lignes pour les colonnes et des colonnes pour les lignes

SELECT 
     Column, 
     SUM(Row1) AS Row1, 
     SUM(Row2) AS Row2, 
     SUM(Row3) AS Row3, 
     SUM(Row4) AS Row4, 
     SUM(Row5) AS Row5, 
     SUM(Row6) AS Row6, 
     SUM(Row7) AS Row7, 
     SUM(Row8) AS Row8, 
     SUM(Row9) AS Row9, 
     SUM(Row10) AS Row10, 
     SUM(Row11) AS Row11, 
     SUM(Row12) AS Row12, 
     SUM(Row13) AS Row13, 
     SUM(Row14) AS Row14, 
     SUM(Row15) AS Row15, 
     SUM(Row16) AS Row16, 
     SUM(Row17) AS Row17 
FROM #temp 
GROUP BY 
Column 

j'obtenir le résultat comme ceci:

Column  Row1         Row2         
----------- --------------------------------------- --------------------------------------- 
1   45.00         0.00          
2   19.00         0.00    

Et voudrais obtenir ceci:

Row   1          2         
----------- --------------------------------------- --------------------------------------- 
Row1   45.00         19.00          
Row2   0.00         0.00  

Mais le numéro de colonne peut varier, et la syntaxe doit être compatible avec SQL Server 2005. Comment puis-je obtenir quelque chose comme ça?

+0

Cocher cette question http://stackoverflow.com/questions/13092867/sql-server-2008-convert-column-value-to-row –

+0

http: // stackoverflow.com/questions/9547485/swap-some-rows-into-columns-in-sql-server-2008 –

Répondre

1

Basé sur votre requête actuelle et que vous voulez les valeurs column dans une colonne, alors ma suggestion serait d'appliquer à la fois le UNPIVOT, puis la fonction PIVOT.

La fonction UNPIVOT prend les multiples colonnes row1, row2, etc. et les convertit en plusieurs lignes. Ensuite, vous pouvez prendre des valeurs et les convertir en colonnes.

La requête sera:

select row, [1], [2] 
from 
(
    select [column], [row], value 
    from #temp 
    unpivot 
    (
    value 
    for row in (row1, row2, row3, row4, row5, row6, 
       row7, row8, row9, row10, row11, row12, 
       row13, row14, row15, row16, row17) 
) un 
) src 
pivot 
(
    sum(value) 
    for [column] in ([1], [2]) 
) piv; 

Voir SQL Fiddle with Demo.

La version ci-dessus fonctionnera bien si vous avez un nombre connu de valeurs, mais si les valeurs sont inconnues, alors vous aurez besoin d'utiliser SQL dynamique à la fois PIVOT et UNPIVOT:

DECLARE @colsUnpivot AS NVARCHAR(MAX), 
    @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @colsUnpivot = stuff((select ','+quotename(C.name) 
     from sys.columns as C 
     where C.object_id = object_id('yt') and 
       C.name != 'column' 
     for xml path('')), 1, 1, '') 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME([column]) 
        from yt 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 


set @query 
    = 'select row, '[email protected]+' 
    from 
    (
     select [column], [row], value 
     from yt 
     unpivot 
     (
      value 
      for [row] in ('+ @colsunpivot +') 
     ) u 
    ) src 
     pivot 
     (
     sum(value) 
     for [column] in ('[email protected]+') 
    )piv' 

exec(@query); 

Voir SQL Fiddle with Demo. Tous les deux donnent le résultat:

| ROW | 1 | 2 | 
-------------------- 
| row1 | 55 | 93 | 
| row2 | 112 | 21 | 
| row3 | 523 | 24 | 
| row4 | 665 | 179 | 
+0

Merci beaucoup! – formatc

+0

@ user1010609 Vous êtes les bienvenus! – Taryn

Questions connexes