生成动态列结果集

【问题】

根据传入时间生成该时间当月之前的时间数据

根据查询条件:比如传入时间20150103为条件,查询当月该时间前的所有时间(201501012015010220150103)每个项目的总和,传入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条件查询出数据,得到A1d_date是网格参数,在集算器的菜单“程序-网格参数”中设置;

 

A2: 创建用于保存最终结果的序表A2

A3: A1.group(Prjno,Subtask)是对原始数A1按项目号、子项目号进行分组,后半句是将分组后的序列进行处理,生成记录保存到A2中,最终得到需要的查询结果A2