“日期”列的类型与UNPIVOT列表中指定的其他列的类型冲突

时间:2019-06-08 22:34:18

标签: sql sql-server tsql

我有以下代码在一组列上执行“透视”和“取消透视”:

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

1 个答案:

答案 0 :(得分:0)

这篇文章对解释这个问题很有帮助。基本上,我必须将unpivot部分的内部select语句中所有列的值都转换为十进制:

Error : The type of column "DOB" conflicts with the type of other columns specified in the UNPIVOT list