sql - 有时缺少数据时的行到列
问题描述
将数据从行转换为列。我有两ID
行,一个文本VARCHAR2
类型行。但其中一ID
排并不总是相同的。有时会丢失数据。
我试过了PIVOT
,GROUP BY
直到现在这给了我唯一的错误。
SELECT prj_id, udn_id, txt_value
FROM TBL
GROUP BY tbl.prj_id;
我想改变这个:(空行只是为了更好的可见性)
PRJ_ID UDN_ID TXT_ VALUE
8344 82 13/10/2009
8344 64 E S
8344 178 End
8364 82 12/10/2009
8364 64 A M
8364 89 M
8364 178 Internal
8335 82 05/10/2009
8335 64 E S
8335 89 N
8335 178 End
8377 82 13/10/2009
8377 64 Z D
8377 89 N;M
8377 178 Internal
对此:
82 64 89 178
8344 13/10/2009 E S N/A End
8364 12/10/2009 A M M Internal
8335 05/10/2009 E S N End
8377 13/10/2009 Z D N;M Internal
知道如何用 SQL 解决这个问题吗?
解决方案
老式的方法(在 之前PIVOT
)是使用DECODE
(或CASE
,为了更好的可读性)聚合值。这是一个示例(第 16 行以后是您要查找的内容):
SQL> with tbl (prj_id, udn_id, txt_value) as
2 (select 8344, 82, '13/10/2009' from dual union all
3 select 8344, 64, 'E S' from dual union all
4 select 8344, 178, 'End' from dual union all
5 --
6 select 8364, 82, '12/10/2009' from dual union all
7 select 8364, 64, 'A M' from dual union all
8 select 8364, 89, 'M' from dual union all
9 select 8364, 178, 'Internal' from dual union all
10 --
11 select 8335, 82, '05/10/2009' from dual union all
12 select 8335, 64, 'E S' from dual union all
13 select 8335, 89, 'N' from dual union all
14 select 8335, 178, 'End' from dual
15 )
16 select prj_id,
17 max(case when udn_id = 82 then txt_value end) "82",
18 max(case when udn_id = 64 then txt_Value end) "64",
19 max(case when udn_id = 89 then txt_value end) "89",
20 max(case when udn_id = 178 then txt_Value end) "178"
21 from tbl
22 group by prj_id;
PRJ_ID 82 64 89 178
---------- ---------- ---------- ---------- ----------
8335 05/10/2009 E S N End
8344 13/10/2009 E S End
8364 12/10/2009 A M M Internal
SQL>
推荐阅读
- c - scanf 如何知道何时结束 for 循环?
- javascript - Javascript - 我的密码检查器不打印任何内容
- docker - 如何从一个 docker 容器 ssh 到另一个 docker 容器?
- kotlin - 错误代码 415 与改造
- r - chart.TimeSeries 不遮蔽期间区域
- oracle - 子区域中的 Oracle Apex 5.1 交互式网格消失
- keras - 使用卷积 LSTM 生成下一帧
- java - 我无法从 Firebase 获取值并将它们放入片段中的 TextView
- mysql - mysql - 来自子查询值列表的正则表达式
- python - 反复卷积两个大数组[python]