动态列互换

【问题】

       一张表
物品        位置        数量
物品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格最终的结果:

undefined

    写好的脚本如何在应用程序中调用,可以参考Java 如何调用 SPL 脚本

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值