我有以下代码在一组列上执行“透视”和“取消透视”:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX),
@colsUnpivot AS NVARCHAR(MAX)
select @colsUnpivot = stuff((select ','+quotename(C.name)
from tempdb.sys.columns as C
where C.object_id = object_id('tempdb..#TmpTable')
for xml path('')), 1, 1, '')
SET @cols = STUFF((SELECT ',' + QUOTENAME(a.Date)
FROM
(Select top 10000 date from
#TmpTable
order by date) a
group by a.Date
order by a.Date
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT name, ' + @cols + ' from
(
select Date,name,value
from #TmpTable
unpivot
(
value for name in ('+@colsUnpivot+')
) unpiv
) x
pivot
(
sum(value)
for date in (' + @cols + ')
) p '
exec(@query)
但是,我不断收到这些错误,我无法弄清原因:
“日期”列的类型与UNPIVOT列表中指定的其他列的类型相冲突。
无效的列名称“日期”
临时表中Date
列的类型为datetime
。
答案 0 :(得分:0)
这篇文章对解释这个问题很有帮助。基本上,我必须将unpivot部分的内部select语句中所有列的值都转换为十进制: