我有这样的数据集
[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);
答案 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)
a
和b
分为两行,因为您为枢轴添加了[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)