sql-server-2008-r2 - 由于类型冲突,反透视数据失败
问题描述
我正在使用 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 列表中指定的其他列的类型冲突。
解决方案
将所有列带入相同的数据类型将允许您使用该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
小提琴以查看实际情况。
推荐阅读
- javascript - 如何使用 JavaScript 实现函数管道,并抛出错误?
- assembly - 将无符号 64 位整数转换为双精度会给出奇怪的汇编代码
- python - PermissionError: [Errno 13] - 我在尝试使用来自 Github 的“brownie”包时在我的 Ubuntu/WSL 设置中遇到了这个错误
- javascript - 在 svelte 中将值从子级传递给父级 - 绑定指令的直觉
- api - 我不想清除柏树中的现金和饼干
- python - 如何在python中生成独特的彩色图像
- flutter - 按下时浮动操作按钮的奇怪背景形状
- java - 3D对象SceneView Sceneform android的CameraPreview
- wordpress - wordpress 网站 url 上的前缀导致 404 错误
- javascript - 悬而未决的承诺已取消