Sql server 具有动态字段的SQL Server Pivot
尝试找出下表中日期字段动态透视表的最佳方法。问题是这些日期会更改,因此我无法在pivot语句中硬编码它们Sql server 具有动态字段的SQL Server Pivot,sql-server,pivot,Sql Server,Pivot,尝试找出下表中日期字段动态透视表的最佳方法。问题是这些日期会更改,因此我无法在pivot语句中硬编码它们 id value date 1 55 2012-12-29 00:00:00:00 1 54 2012-10-29 00:00:00:00 1 89 2013-02-02 00:00:00:00 2 45 2012-12-29 00:00:00:00 2 54 2012-10-29 00:00:00:00 4 78 2012-12-29 00:
id value date
1 55 2012-12-29 00:00:00:00
1 54 2012-10-29 00:00:00:00
1 89 2013-02-02 00:00:00:00
2 45 2012-12-29 00:00:00:00
2 54 2012-10-29 00:00:00:00
4 78 2012-12-29 00:00:00:00
4 90 2012-10-29 00:00:00:00
4 23 2012-10-29 00:00:00:00
我希望输出像这样
id 2012-12-29 00:00:00:00 2012-10-29 00:00:00:00 2013-02-02 00:00:00:00
1 55 54 89
2 45 54 null
4 78 90 23
由于您使用的是SQL Server,因此可以使用
PIVOT
功能
如果已知值,则可以硬编码这些值:
select *
from
(
select id, value, date
from yourtable
) src
pivot
(
max(value)
for date in ([2012-12-29], [2012-10-29], [2013-02-02])
) piv
看
但如果它们未知,则需要使用动态sql:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(varchar(50), date, 120))
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT id, ' + @cols + ' from
(
select id, value, convert(varchar(50), date, 120) date
from yourtable
) x
pivot
(
max(value)
for date in (' + @cols + ')
) p '
execute(@query)
看
两个查询的结果都是:
| ID | 2012-10-29 00:00:00 | 2012-12-29 00:00:00 | 2013-02-02 00:00:00 |
------------------------------------------------------------------------
| 1 | 54 | 55 | 89 |
| 2 | 54 | 45 | (null) |
| 4 | 90 | 78 | (null) |
试试这个
DECLARE @columns VARCHAR(8000)
-- set columns for pivot
SELECT @columns = COALESCE(@columns + ',[' + cast([date] as varchar(50)) + ']', '[' + cast([date] as varchar(50))+ ']')
FROM TableName
EXEC(' SELECT *, ' + @columns + ' FROM
(
SELECT * FROM TableName
) As a
PIVOT (MAX(value) FOR DATE IN (' + @columns + ') ) As P')
可能重复的