时间段动态列求和

【问题】

表如下:
名字  数据    时间
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        ……       ………………

 

【回答】

       如果是为了做报表,这属于典型的交叉报表需求,使用任何支持横向扩展的报表工具都能完成,如在润乾报表里可以这样完成:

报表数据集SQLselect 名字,left(时间,6) as 时间,数据 from SHIP_BERTH

报表表达式:

undefined

 

undefined

     如果计算不是为了出报表,而是为其他程序提供该格式的数据源,这种动态列结果集用SQL就很难完成了,需要动态生成SQL语句。 SPL很容易实现:


A

B

1

$ select 名字,left(时间,6) as 时间,数据 from SHIP_BERTH

2

= A1.groups(名字,时间;sum(数据):数据)


3

=A2.pivot(名字;时间,数据)

A1:从数据库取数

A2:按“名字”,“时间”分组,并分组对“数据”求和

A3:对A2序表的“时间”和“数据”列数据行列互换

最终返回序表为:

undefined

脚本写好后,在其他应用程序中,就可以利用集算器JDBC调用该数据集了。Java 如何调用 SPL 脚本