sql - 识别NULL并分配位图
问题描述
我有一张桌子
表格1
u_a_id e_id e_nm e_val e_seq
1 104 test 100 4
1 102 test2 x 2
1 102 test2 (null) 1
1 104 test (null) 1
2 102 test2 (null) 2
2 102 test2 (null) 1
2 104 test 101 1
2 104 test 102 2
我需要首先对每个 u_a_id 进行排序e_id
,并将每个标识为 1,然后创建一个如下所示的位图。e_seq
(null)
例如。
- u_a_id = 1 - 第一个 e_id = 102, e_seq = 1, e_val = (null), 所以分配它 1
- u_a_id = 1 - 第一个 e_id = 102, e_seq = 2, e_val = x, 所以赋值为 0
- u_a_id = 1 - 第一个 e_id = 104, e_seq = 1, e_val = (null), 所以分配它 1
- u_a_id = 1 - 第一个 e_id = 104,e_seq = 4,e_val = 100,所以分配它 0
因此,对于 u_a_id = 1,添加一个新行 - EMPTY = 1010
输出将是:
u_a_id e_id e_nm e_val e_seq
1 104 test 100 4
1 102 test2 x 2
1 102 test2 (null) 1
1 104 test (null) 1
1 (null) EMPTY 1010 (null)
2 102 test2 (null) 2
2 102 test2 (null) 1
2 104 test 101 1
2 104 test 102 2
2 (null) EMPTY 1100 (null)
Oracle SQL 中有没有办法做到这一点?
解决方案
您可以LISTAGG
用于字符串聚合和GROUPING SETS
:
SELECT U_A_ID, E_ID
,CASE WHEN GROUPING_ID(U_A_ID, E_ID, E_NM, E_VAL, E_SEQ) = 15
THEN 'EMPTY'
ELSE E_NM END AS E_NM
,CASE WHEN GROUPING_ID(U_A_ID, E_ID, E_NM, E_VAL, E_SEQ) = 15
THEN LISTAGG(NVL2(E_VAL, '1', '0'),'') WITHIN GROUP (ORDER BY E_ID DESC, E_SEQ DESC)
ELSE E_VAL END AS E_VAL
,E_SEQ
FROM E
GROUP BY GROUPING SETS ((U_A_ID, E_ID, E_NM, E_VAL, E_SEQ), (U_A_ID))
ORDER BY U_A_ID, E_ID, E_SEQ;
推荐阅读
- yocto - 覆盖其他配方中未软分配的变量 (?=)
- highcharts - 点击highcarts上的图例时如何隐藏其他系列?
- dart - 在 dart 中运行外部命令
- c# - 试图创建一个 switch 语句但不起作用,只出现一个黑色窗口
- javascript - nodejs中我的sql查询中的语法错误| 错误:ER_PARSE_ERROR:您的 SQL 语法有错误;
- c# - C# - 打印 PDF 错误 (System.ComponentModel.Win32Exception:...)
- python-mock - 为什么在为模拟引发错误时既有返回值又有副作用?
- python - 为什么我的游戏在使用 pygame.time.wait 或 pygame.time.delay 时会死机?
- python - 没有清除董事会
- c++ - 在 Apple 上使用 CMake 编译 SFML 时出现问题