首页 > 解决方案 > 由于类型冲突,反透视数据失败

问题描述

我正在使用 SQL Server 2008,并且正在尝试取消数据透视。这是我正在使用的数据:

TIME_ELAPSE BUILDINGS_CLEARED FLOORS_CLEARED AWAITING_PERC
----------- ----------------- -------------- ------------------
15h 21m     4/4               12/12          0

我需要像行值这样的输出到列:

TIME_ELAPSE         15h 21m 
BUILDINGS_CLEARED   4/4
FLOORS_CLEARED      12/12
AWAITING_PERC       0

我尝试了什么:

SELECT NAME,VALUE
FROM #TEMP_DRILLUP_SUMMARY
UNPIVOT(VALUE FOR NAME IN (Time_Elapse,BUILDINGS_CLEARED,FLOORS_CLEARED,AWAITING_PERC))D

我收到的错误:

消息 8167,级别 16,状态 1,第 72 行列“BUILDINGS_CLEARED”的类型与 UNPIVOT 列表中指定的其他列的类型冲突。

标签: sql-server-2008-r2

解决方案


将所有列带入相同的数据类型将允许您使用该UNPIVOT语句。

样本数据

create table test2
(
  TIME_ELAPSE nvarchar(10),
  BUILDINGS_CLEARED nvarchar(10),
  FLOORS_CLEARED nvarchar(10),
  AWAITING_PERC int -- different type!
);

insert into test2 (TIME_ELAPSE, BUILDINGS_CLEARED, FLOORS_CLEARED, AWAITING_PERC) values
('15h 21m', '4/4',  '12/12',  '0');

问题再现

SELECT NAME, VALUE
FROM test2
UNPIVOT(VALUE FOR NAME IN (Time_Elapse, BUILDINGS_CLEARED, FLOORS_CLEARED, AWAITING_PERC)) D

这给出了:

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

解决方案

在取消透视之前将所有列都设置为相同的数据类型(我之所以使用nvarchar(10)是因为您没有包含表定义)。

with cte as
(
  select TIME_ELAPSE,
         BUILDINGS_CLEARED,
         FLOORS_CLEARED,
         convert(nvarchar(10), AWAITING_PERC) as AWAITING_PERC -- align data types
  from test2
)
SELECT NAME, VALUE
FROM cte
UNPIVOT(VALUE FOR NAME IN (TIME_ELAPSE, BUILDINGS_CLEARED, FLOORS_CLEARED, AWAITING_PERC)) D

结果

NAME              VALUE
----------------- -------
TIME_ELAPSE       15h 21m
BUILDINGS_CLEARED 4/4
FLOORS_CLEARED    12/12
AWAITING_PERC     0

小提琴以查看实际情况。


推荐阅读