【发布时间】:2018-01-03 14:19:18
【问题描述】:
我有一排有几个诊断代码。如何将列取消透视为行?我尝试了以下查询来取消透视,但我不确定如何获取列号DX_Order,例如DX01、DX_Order=1。我相信 UNPIVOT. 会处理 NULL
当前表
+----+------+-------+-------+------+----+------+
| ID | Name | DX01 | DX02 | DX03 | .. | DX25 |
+----+------+-------+-------+------+----+------+
| 1 | John | 426S3 | G2634 | NULL | .. | NULL |
+----+------+-------+-------+------+----+------+
预期结果
+----+------+----------+-------+
| ID | Name | DX_Order | DX |
+----+------+----------+-------+
| 1 | John | 1 | 426S3 |
| 1 | John | 2 | G2634 |
+----+------+----------+-------+
查询
SELECT ID, Name, DX
FROM
(
SELECT ID, Name, DX01, DX02, DX03...DX25
FROM dbo.Table
) AS cp
UNPIVOT
(
DX FOR DXs IN (DX01, DX02, DX03....DX25)
) AS up;
【问题讨论】:
-
如果你的数据总是有 dx 按升序排列而没有间隙,那么简单的 row_number() 在数据分区上就可以解决这个问题。
标签: sql sql-server pivot unpivot