动态列转置

【问题】

写段SQL,完成以上表格转换,
说明:数据查询结果是不确定的,有可能1#/2#/3#/4#机组还生产其他产品,

undefined

【回答】

       SQL不直接支持返回动态列,ORACLEpivot可以支持某些形式的动态列,但不是针对普通的数据。这种情况需写出动态的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 脚本