生成动态列结果集
【问题】
根据传入时间生成该时间当月之前的时间数据
根据查询条件:比如传入时间20150103为条件,查询当月该时间前的所有时间(20150101、20150102、20150103)每个项目的总和,传入20150110,则生成10个日期列。
我想生成这样的报表数据:
项目号 子项目号 工时数(动态列)...
Prjno Subtask 20150101 20150102 20150103 ...
P9996 P9996-sub002 128 200 150
T0071 T-007-01 40 100 100
.......
怎么做啊?有什么办法吗?
【回答】
这是个动态列结果集问题,SQL很难写出这种结果集,用动态语言的SPL就容易写出来。
A |
|
1 |
=oracle.query("select * from project where Ddate>=? and Ddate<=?", pdate@m(d_date) ,d_date) |
2 |
=${"create(Prjno,Subtask,"+periods(pdate@m(d_date),d_date,1).concat@c()+")"} |
3 |
>A1.group(Prjno,Subtask).run(A2.record( ~.Prjno | ~.Subtask | ~.group(Ddate).(~.sum(Num)))) |
执行SPL前先将问题中的数据保存到数据库的project表中,在集算器里增加连接Oracle 数据库的数据源 oracle(可参考《集算器怎样使用 oracle 数据库 [集算器怎样使用 oracle 数据库](https://c.raqsoft.com.cn/article/1541489540894) 和官网文档《数据库配置》http://doc.raqsoft.com.cn/esproc/tutorial/sjkpzh.html)。
脚本含义如下:
A1: oracle是数据源对象,使用query条件查询出数据,得到A1,d_date是网格参数,在集算器的菜单“程序-网格参数”中设置;
A2: 创建用于保存最终结果的序表A2:
A3: A1.group(Prjno,Subtask)是对原始数据A1按项目号、子项目号进行分组,后半句是将分组后的序列进行处理,生成记录保存到A2中,最终得到需要的查询结果A2: