【发布时间】:2019-06-09 13:40:48
【问题描述】:
我有以下代码在一组列上执行 Pivot 和 Unpivot:
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。
【问题讨论】:
-
您需要将其转换为字符串才能与其他列兼容。
-
在不深入研究问题的情况下,我建议您使用与数据库保留字不同的名称。
-
谢谢。现在,我收到其他十进制列的 UNPIVOT 列表的数据类型错误。我应该将值转换为十进制吗?
-
这是我尝试过的,但仍然得到相同的错误:select date,name,CONVERT(DECIMAL(38,4),value) as value from #TmpTable
标签: sql sql-server tsql