【问题标题】:Transposing Rows in to colums in SQL Server 2005在 SQL Server 2005 中将行转换为列
【发布时间】:2012-08-04 13:31:26
【问题描述】:

我有一个 sql 查询“Select * from tablename”,其输出为

col1   col2       
  A     1 
  B     2 
  C     3

我想将上面的输出修改如下

A      B      C
1      2      3 

请告诉我如何实现这一目标

【问题讨论】:

标签: sql sql-server tsql sql-server-2005 pivot


【解决方案1】:

您需要执行PIVOT。使用 PIVOT 有两种方法可以做到这一点,一种是您对要转换的列进行编码的静态 Pivot,另一种是在执行时确定列的动态 Pivot。

静态枢轴:

SELECT *
FROM
(
    SELECT col1, col2
    FROM yourTable
) x
PIVOT
(
   min(col2)
   for col1 in ([A], [B], [C])
)p

SQL Fiddle with Demo

动态枢轴:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(col1) 
                    from t1
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT ' + @cols + ' from 
             (
                select col1, col2
                from t1
            ) x
            pivot 
            (
                min(col2)
                for col1 in (' + @cols + ')
            ) p '

execute(@query)

SQL Fiddle with Demo

如果您不想使用PIVOT 函数,则可以使用CASE 语句执行类似类型的查询:

select 
  SUM(CASE WHEN col1 = 'A' THEN col2 END) as A,
  SUM(CASE WHEN col1 = 'B' THEN col2 END) as B,
  SUM(CASE WHEN col1 = 'C' THEN col2 END) as C
FROM t1

SQL Fiddle with Demo

【讨论】:

  • 感谢上述解决方案,但对于 Dynamic Pivot,列的顺序已更改,即列名按 desc 顺序排列,因为我不想更改列的顺序...有吗保持列顺序不变的任何方式..因为此代码 select @cols = STUFF((SELECT distinct ',' + QUOTENAME(col1) from t1 FOR XML PATH(''), TYPE ).value('. ', 'NVARCHAR(MAX)') ,1,1,'') 改变列顺序
【解决方案2】:

您想在 sql 中使用 PIVOTCOALESCE。这是一个很好的例子,如何将行转换为列。 Five methods converting rows to columns

.

【讨论】:

    猜你喜欢
    • 2012-03-19
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 2011-08-18
    • 2013-10-01
    相关资源
    最近更新 更多