【问题标题】:conflicts with the type of other columns specified in the UNPIVOT list与 UNPIVOT 列表中指定的其他列的类型冲突
【发布时间】:2016-12-11 20:22:12
【问题描述】:

有人可以帮我解决这个问题吗?我收到一个错误提示

“名称”列的类型与其他列的类型冲突 在 UNPIVOT 列表中指定

我尝试将名称转换为 varchar,但没有任何效果。

;with hd (id, name, parentid, category)
as
(
  select CAPABILITY_COMPONENT_ID id, CAPABILITY_COMPONENT_NAME name, CAPABILITY_PARENT_ID as parentid, 1 as category
  from [dbo].[TDM_FCT_CPBLITY]
  where CAPABILITY_PARENT_ID = -1
  union all
  select t1.CAPABILITY_COMPONENT_ID, t1.CAPABILITY_COMPONENT_NAME, t1.CAPABILITY_PARENT_ID, hd.category +1
  from [dbo].[TDM_FCT_CPBLITY] t1
  inner join hd
    on t1.CAPABILITY_PARENT_ID = hd.id
)
select category categoryNumber
into #temp
from hd

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + quotename('cat_'+cast(categoryNumber as varchar(10))+'_'+col) 
                  from #temp
                  cross apply (select 'id' col
                               union all 
                               select 'name' col) src
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = ';with hd (id, name, parentid, category)
              as
              (
                select CAPABILITY_COMPONENT_ID as id, CAPABILITY_COMPONENT_NAME as name, CAPABILITY_PARENT_ID as parentid, 1 as category
                from [dbo].[TDM_FCT_CPBLITY]
                where CAPABILITY_PARENT_ID = -1
                union all
                select t1.CAPABILITY_COMPONENT_ID, t1.CAPABILITY_COMPONENT_NAME, t1.CAPABILITY_PARENT_ID, hd.category +1
                from [dbo].[TDM_FCT_CPBLITY] t1
                inner join hd
                  on t1.CAPABILITY_PARENT_ID = hd.id
              ),
              unpiv as
              (
                select value, ''cat_''+cast(category as varchar(5))+''_''+ col col_name
                from
                (
                  select cast(id as varchar(17)) id, name, parentid, category                 
                  from hd
                ) src
                unpivot
                (
                  value for col in (id, name)
                ) un
              )
              select '+@cols+'
              from unpiv
              pivot
              (
                max(value)
                for col_name in ('+@cols+')
               ) piv'

execute(@query)

drop table #temp

【问题讨论】:

  • 拒绝投票和/或关闭请求的一个原因可能是,Why is my code not working? 明确命名为 What is 所以 find details here
  • 能否添加 CREATE TABLE 语句和一些插入值?
  • 我可以建议你只显示最后的@query 语句,不带引号吗?

标签: sql-server


【解决方案1】:

UNPIVOT 不是反透视数据的最佳方式。

将代码的 UNPIVOT 部分替换为“CROSS APPLY with VALUES”,这是一种更好的方法,更高效且实施起来更简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 2021-09-29
    • 1970-01-01
    相关资源
    最近更新 更多