如何使用动态行分组透视表?

时间:2015-02-26 22:03:14

标签: sql-server tsql

我有这样的数据集

[student][datetime][dictionary][value]
[1234   ][datetime][1         ][a    ]
[1234   ][datetime][2         ][b    ]

我想创建一个像这样的数据集

[student][1         ][2    ]
[1234   ][a         ][b    ]

我知道SQL Server枢轴是实现此目的的一种方法。我已经编写了下面的代码来尝试转移数据,但它自然没有分组。

所以我的结果最终是这样的:

[student][datetime][1         ][2    ]
[1234   ][datetime][null      ][b    ]
[1234   ][datetime][a         ][null ]

我怎样才能最好地将这些分组?我不关心在最终数据集中使用其他源列,例如datetime,只关注字典和值的矩阵

谢谢

DECLARE @columns AS VARCHAR(MAX);
DECLARE @sql AS VARCHAR(MAX);
SELECT @columns = substring((Select DISTINCT ',' + QUOTENAME(dictionary)     FROM syuservalues FOR XML PATH ('')),2, 1000);

SELECT @sql =

'SELECT Pivoted.*
FROM syuservalues
PIVOT 
( MAX(value) 
  FOR dictionary IN( ' + @columns + ' )) as Pivoted where student =     327392'; ' Will eventually want it for all students

EXECUTE(@sql);

2 个答案:

答案 0 :(得分:1)

对于这类问题,您可以使用任意聚合函数,以便摆脱空值。我通常使用max,因为它可以用于数字和字符串数据类型。

select pivoted.student, [1] = max([1]), [2] = max([2])
from syuservalues
pivot(max(value) for dictionary in(...)) pivoted
group by pivoted.student

答案 1 :(得分:1)

ab分为两行,因为您为枢轴添加了[datetime]列,[datetime]和{{1}添加了a值将会有所不同。

样本表

b

声明一个变量以动态获取pivot的列

CREATE TABLE #TEMP([student] INT,[datetime] DATETIME,[dictionary] INT,[value] VARCHAR(30))

INSERT INTO #TEMP
SELECT 1234,'2015-02-01',1,'a'
UNION ALL
SELECT 1234, '2015-02-01',2,'b' 

现在转动它。我在里面写了逻辑。

DECLARE @cols NVARCHAR (MAX)

SELECT @cols = COALESCE (@cols + ',[' + CAST([dictionary] AS VARCHAR(10)) + ']', 
                '[' + CAST([dictionary] AS VARCHAR(10)) + ']')
               FROM    
               (
                    SELECT DISTINCT [dictionary]  
                    FROM #TEMP                     
                ) PV 
               ORDER BY CAST([dictionary] AS INT)