首页 > 解决方案 > 识别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,添加一个新行 - 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 中有没有办法做到这一点?

标签: sqloracle

解决方案


您可以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;

db<>小提琴演示


推荐阅读