分组汇总后按指定序列对齐
Oracle数据的temp_data表如下。
TRANSACT_DT_TM |
LETTER |
2023-01-01 00:00:00 |
K |
2023-01-02 00:00:00 |
K |
2023-01-02 00:00:00 |
L |
2023-01-03 00:00:00 |
Q |
2024-01-02 00:00:00 |
Y |
2024-01-03 00:00:00 |
B |
temp_data表的LETTER字段是外键,指向temp_ref表的LETTER字段。temp_ref表的LETTER_SEQ规定了LETTER的顺序。
LETTER |
LETTER_SEQ |
Y |
10 |
B |
20 |
Q |
30 |
K |
40 |
L |
50 |
要求:对temp_data按照年份和LETTER分组,对记录数计数,再按照年份、LETTER的叉乘对齐,对不上则为null。叉乘时年份按时间顺序排列,LETTER按LETTER_SEQ的顺序排列。
YEAR |
LETTER |
CNT |
2023 |
Y |
|
2023 |
B |
|
2023 |
Q |
1 |
2023 |
K |
2 |
2023 |
L |
1 |
2024 |
Y |
1 |
2024 |
B |
1 |
2024 |
Q |
|
2024 |
K |
|
2024 |
L |
编写SPL代码:
A |
|
1 |
=orcl.query("select to_char(TRANSACT_DT_TM,'YYYY') , LETTER,count(1) from temp_data group by to_char(TRANSACT_DT_TM,'YYYY'), LETTER") |
2 |
=orcl.query("select LETTER from temp_ref order by LETTER_SEQ") |
3 |
=xjoin(A1.id(#1):YEAR;A2:LETTER).join(#1:#2,A1:#1:#2,#3:CNT) |
A1、A2:执行简单SQL,对temp_data分组汇总;按顺序取出 LETTER。
A3:先叉乘,再外键式关联 A1。#1 表示第 1 个字段。
来源:https://stackoverflow.com/questions/78416274/left-join-for-subset-of-data
英文版 https://c.scudata.com/article/1724223630503