时间段动态列求和
【问题】
表如下:
名字 数据 时间
A 2 20140101
B 3 20140107
C 4 20140104
A 3 20140109
A 1 20140206
C 3 20140301
C 2 20140201
A 1 20140207
为名字和分时间段求和,能不能直接查询出如下格式?
名字 201401 201402 时间段3………………
A 5 2 …… ………………
B 3 0 …… ………………
C 4 2 3 …… ………………
【回答】
如果是为了做报表,这属于典型的交叉报表需求,使用任何支持横向扩展的报表工具都能完成,如在润乾报表里可以这样完成:
报表数据集SQL:select 名字,left(时间,6) as 时间,数据 from SHIP_BERTH
报表表达式:
如果计算不是为了出报表,而是为其他程序提供该格式的数据源,这种动态列结果集用SQL就很难完成了,需要动态生成SQL语句。用 SPL很容易实现:
A |
B |
|
1 |
$ select 名字,left(时间,6) as 时间,数据 from SHIP_BERTH |
|
2 |
= A1.groups(名字,时间;sum(数据):数据) |
|
3 |
=A2.pivot(名字;时间,数据) |
A1:从数据库取数
A2:按“名字”,“时间”分组,并分组对“数据”求和
A3:对A2序表的“时间”和“数据”列数据行列互换
最终返回序表为:
脚本写好后,在其他应用程序中,就可以利用集算器JDBC调用该数据集了。Java 如何调用 SPL 脚本