动态列互换
【问题】
一张表
物品 位置 数量
物品A 位置1 1000
物品A 位置2 2000
物品B 位置1 4000
物品B 位置3 1000
物品C 位置2 1500
(位置字段范围是固定的:位置1-位置3)。
一、求得第一个sql语句是要得到下面这样的表:
日期 位置1 位置2 位置3
系统时间 5000 3500 1000
简单说就是需要统计某个系统时间点每个位置的所有物品的数量。比如原表中位置1中有物品A 1000个和物品B 4000个。所以位置1中总数有1000+4000=5000个。
二、求得第二个sql语句是要得到下面这样的表:
日期 物品A 物品B 物品C
系统时间 3000 5000 1500
和第一个根据位置统计不同,这里是在某个系统时间点根据每个物品来统计数量。比如原表中物品A在位置1和位置2总共有3000个
谢谢大家!
【回答】
这两个计算其实是一样的,都是要生成动态列的行列互换结果集。ORACLE有pivot语法可以实现行列互换,但并不支持动态列结果集。写存储过程使用动态SQL语句也很麻烦,而且难以调试,所以这种情况一般要读出来再自己处理了。如果是为了报表呈现,那么随便找一个支持交叉报表的报表工具都可以(也就是读出来在呈现端处理的),比如润乾报表,直接进行横向分组扩展即可。
如果这个计算结果是为了其他程序输出,使用SPL可以写成这样:
A |
|
1 |
$select 物品,sum(数量) 数量 from tb group by 物品 |
2 |
=1.new(now():日期,${A1.(string(数量)+”:”+物品).concat@c()}) |
A1: 对tb表按照“物品”字段分组统计“数量”
A2:生成一个由日期,物品A,物品B,物品C,…组成的新序表
日期 字段值为当前系统日期now()
各种物品的字段值为每种物品的汇总数量,由A1.(string(数量)+”:”+物品).concat@c()拼成了诸如:3000:物品A,5000:物品B,1500:物品C,…这样的串,然后通过${}宏替换即可实现动态列的新序表的生成。
A2格最终的结果:
写好的脚本如何在应用程序中调用,可以参考Java 如何调用 SPL 脚本