动态列转置
【问题】
写段SQL,完成以上表格转换,
说明:数据查询结果是不确定的,有可能1#/2#/3#/4#机组还生产其他产品,
【回答】
SQL不直接支持返回动态列,ORACLE的pivot可以支持某些形式的动态列,但不是针对普通的数据。这种情况需写出动态的SQL来拼出结果集。但问题中的要求还不是很简单,要找出最大的组才知道列数,拼结果也不是象一般的pivot那样可以用字段值直接对应成列,这可能要写存储过程一步步地完成才方便,否则即使写出来也很难看懂而难以维护了。
用SPL写出来是这样:
A |
B |
|
1 |
$select 机组,类别,sum(产量) 产量 from 产量表 group by 机组,类别 |
|
2 |
=A1.group(机组) |
|
3 |
=A2.max(~.len()) |
|
4 |
=A3.("类别"+string(#)+",产量"+string(#)).concat@c() |
|
5 |
=create(机组,${A4}) |
|
6 |
for A2 |
=A6.机组|A6.conj([类别,产量]) |
7 |
=A5.record(B6) |
|
8 |
result A5 |
A1:对产量表按照“机组”,“类别”分组统计“产量”
A2:按机组分组
A3:计算出最大的组类别个数
A4:按最大列数拼出诸如“类别1,产量1,类别2,产量2,…”的串
A5:创建由”机组, 类别1,产量1,类别2,产量2,…”字段组成的空序表
A6-B7:对A2循环,把每个机组的所有类别,产量数据拼成诸如[3#机组,苹果6,3000,洛基亚mini,1600,…]的序列,作为一条记录填入A5中
完成运算后再将结果集传给其他应用程序即可。如何在其他应用程序中调用这个数据集,可以参阅Java 如何调用 SPL 脚本