我有以下表格结构,下面列出了预期的输出如何实现结果
id - date - score
1 - 2013/04/13 - 100
2 - 2013/04/14 - 92
3 - 2013/04/15 - 33
预期输出:
date -2013-04-13 - 2013-04-14 - 2013-04-15
score - 100 - 92 - 33
我有以下表格结构,下面列出了预期的输出如何实现结果
id - date - score
1 - 2013/04/13 - 100
2 - 2013/04/14 - 92
3 - 2013/04/15 - 33
预期输出:
date -2013-04-13 - 2013-04-14 - 2013-04-15
score - 100 - 92 - 33
使用PIVOT
表运算符:
SELECT *
FROM (SELECT date, score FROM tablename) AS t
PIVOT
(
MAX(Score)
FOR date IN([2013-04-13], [2013-04-14], [2013-04-15])
) AS p;
在这里查看它的实际效果:
这会给你:
| 2013-04-13 | 2013-04-14 | 2013-04-15 |
----------------------------------------
| 100 | 92 | 33 |
如果要动态执行此操作,则必须使用动态 sql 执行此操作。像这样的东西:
DECLARE @cols AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);
select @cols = STUFF((SELECT distinct ',' +
QUOTENAME(date)
FROM tablename
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
, 1, 1, '');
SET @query = 'SELECT *
FROM (SELECT date, score FROM tablename) AS t
PIVOT
(
MAX(Score)
FOR date IN( ' + @cols+ ' )
) AS p;';
EXECUTE(@query);
在这里查看它的实际效果:
请注意:我假设您的表中有唯一的日期条目,在这种情况下MAX(score)
可以正常工作,以防您可以使用同一天的更多日期条目SUM
。但是,您必须将任何聚合函数与PIVOT
表运算符一起使用。