如何将组结果拆分为无限的单个列

时间:2014-09-25 13:45:57

标签: sql sql-server-2008

如果我有桌子:

id  tstamp  x   y
-----------------
1   111     1   A
2   111     2   B
3   111     3   C
4   222     1   D
5   222     2   E
6   222     3   F
7   333     1   G
8   333     2   H
9   333     3   I
... nnn     ... ...

如何将其拆分为以下内容,其中列数取决于tstamp的范围?

x   y111    y222    y333    ynnn
----------------------------------
1   A       D       G       ...
2   B       E       H       ...
3   C       F       I       ...

这似乎从根本上说很简单,但我找不到任何相关的示例或API?有10个左右的类似问题,但它们都处理字符串处理,csv,xml ???

我想在c#或其他脚本语言中做起来会非常简单,但我希望它在sql中应该是一件容易的事情?

1 个答案:

答案 0 :(得分:0)

您需要为PIVOT构建tstamp的列值并使用动态查询

DECLARE @cols NVARCHAR(MAX)
SELECT  @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
                                '],[' + tstamp
                        FROM    Table1 
                        ORDER BY '],[' + tstamp
                        FOR XML PATH('')
                      ), 1, 2, '') + ']'


DECLARE @query NVARCHAR(4000)
SET @query = N'SELECT x, '+
@cols +'
FROM
(SELECT  x, y, tstamp
FROM    Table1 
) p
PIVOT
(
MAX(y)
FOR tstamp IN
( '+
@cols +' )
) AS pvt
'

exec sp_executesql @query