【问题标题】:Switching rows for columns and columns for rows为列切换行,为行切换列
【发布时间】:2013-04-12 14:20:48
【问题描述】:

我有这样的查询:

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

我得到这样的结果:

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

并且想得到这个:

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

但是列号可以变化,并且语法必须与 sql server 2005 兼容。 我怎样才能实现这样的目标?

【问题讨论】:

标签: tsql sql-server-2005 pivot unpivot


【解决方案1】:

根据您当前的查询并且您希望在列中使用 column 值,那么我的建议是应用 UNPIVOTPIVOT 函数。

UNPIVOT 函数将获取多个row1row2 等列并将它们转换为多行。然后您可以获取值并将它们转换为列。

查询将是:

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;

SQL Fiddle with Demo

如果您有已知数量的值,上述版本会很好用,但如果值未知,那么您将需要对 PIVOT 和 UNPIVOT 使用动态 SQL:

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, '+@cols+' 
     from
     (
       select [column], [row], value
       from yt
       unpivot
       (
          value
          for [row] in ('+ @colsunpivot +')
       ) u
      ) src
      pivot
      (
        sum(value)
        for [column] in ('+@cols+')
      )piv'

exec(@query);

SQL Fiddle with Demo。两者都给出了结果:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多