将垂直sql结果转换为水平输出

时间:2013-07-11 23:04:52

标签: sql sql-server pivot

我有一张桌子,#t有16行:   id int   description varchar(60)   余额十进制(6,2)

我需要描述&平衡数据,“选择描述,按ID排序#t”将完成工作。但理想情况下,我可以水平而不是垂直显示结果。

现在我知道我可以构建一个包含16列的新表,并使用大量动态sql为每个这样的列填充余额,但是,我也确信使用pivot或类似的东西可以更轻松地完成这项工作。那 - 虽然我真的不明白怎么做。

有人可以请我注意吗?

由于 约翰

1 个答案:

答案 0 :(得分:4)

假设您使用的是SQL Server,您可以实现PIVOT函数将数据行转换为列。基本语法为:

select *
from 
(
  select description, balance
  from yourtable
) d
pivot
(
  sum(balance)
  for description in ([desc1], desc2])  -- replace this with the names of your descriptions
) piv;

当然,如果您有不明数量的描述值,那么您将需要使用动态SQL:

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

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

set @query = 'SELECT ' + @cols + ' 
            from 
            (
               select description, balance
               from yourtable
            ) x
            pivot 
            (
                sum(balance)
                for description in (' + @cols + ')
            ) p '

execute sp_executesql @query