【问题】
Table1

Table2

I need to make output like this


【回答】
SQL 无法直接生成变动列数的结果集,需要拼出动态 SQL 再执行,而且后续分组统计的代码也很复杂。这种情况下用 SPL 就相当简单,脚本如下:
| A | |
| 1 | =myDB1.query("select t1.ID ID,t1.Prob Prob,t1.Cost Cost,t1.Visible Visible,t2.Count Cnt,t2.Iteml Iteml from table2 as t2 left join table1 t1 on t1.ID=t2.ID") |
| 2 | =A1.group(ID) |
| 3 | =A2.max(~.count()).("Itml"+string(~)+","+"Cnt"+string(~)).concat@c() |
| 4 | =create(ID,Prob,Cost,Visible,${A3}) |
| 5 | >A2.(A4.record([ID,Prob,Cost,Visible]|~.([Iteml,Cnt]).conj())) |
A1 先用 join 连接两个表
A2 将连接后的新表根据 ID 分组
A3 动态拼出列名,即“Itml1,Cnt1,Itml2,Cnt2,Itml3,Cnt3,Itml4,Cnt4”。
A4 动态创建二维表。
A5 则将 A2 的每组数据向 A4 动态插入记录。
对于此类问题,SPL 的优势在于可先分组而不聚合,但是 SQL 的分组必须伴随聚合。
数据库操作与SPL脚本实现
本文讨论了在处理动态列数的SQL挑战时,如何使用SPL脚本来简化操作。通过示例展示了一种高效的方法,先进行表连接,然后按ID分组,动态生成列名,并创建新的二维表,最后将数据插入。SPL的优势在于其灵活性,可以先分组后聚合,而SQL在此类问题上更为复杂。
686

被折叠的 条评论
为什么被折叠?



