动态按段分组汇总

【问题】

I have a table emp:

Empno Age Deptno
101 10 10
104 30 10
105 60 10
106 60 20
107 20 20

I wanted the output in the below format: Please help me.

Deptno Age<=20 Age<=40 Age<=60
10 1 1 1
20 1 0 1

【回答】

** 根据部门来统计年龄在这三段中——小于等于 20 岁、21 岁到 40 岁、41 岁到 60 岁——的人数。固定条件可以使用一条 sql 语句来实现:

SELECT deptno, NVL (SUM (CASE WHEN age BETWEEN 0 AND 20 THEN 1 END),0) "Age <=20",NVL (SUM (CASE WHEN age BETWEEN 21 AND 40 THEN 1 END),0) "Age <=40",NVL (SUM (CASE WHEN age BETWEEN 41 AND 60 THEN 1 END),0) "Age <=60" FROM emp GROUP BY deptno;

变化条件,比如有时候是“Age<=20,Age<=40,Age<=60”,而有的时候是“Age<=20&Salary>3000, Age<=50”,这时候用 SQL 就不容易了,一般会用 JAVA 或者报表工具来生成 SQL 了,也很麻烦。

SPL 支持动态列结果集,允许把条件作为参数传递,很容易实现这些功能。可以帮助集算器实现上述算法。假设条件参数是 [“Age<=20”,“Age>20 && Age<=40”, “Age>40 && Age<=60”],则代码如下表:

A
1 =["Age<=20","Age>20 && Age<=40", "Age>40 && Age<=60"]
2 =connect("database")
3 =A2.query("select * from emp")
4 = A1.("count("+~+"):"+~)
5 = A3.groups(Deptno;${A4.concat@c()})

A1:条件序列。

A2:连接数据源。

A3:查询 emp 表。

A4:对条件数组的每一个元素改写其格式为:count(条件): 条件。冒号前的部分是根据条件按计数的表达式,后者是结果字段名称。

A5:根据 Deptno 分组查询 A4 定义的字段。concat()函数用分隔符连接 A1 序列成员返回成字符串,@c 表示用逗号连接各个成员。${} 是宏替换,他将 concat 获得的字符串转化为 groups 函数可识别的表达式。如:count(Age<=20):Age<=20 就是根据条件 Age<=20 计数,并且结果字段名定义为 Age<=20。可用的函数还有 sum 等。

A1

imagepng

A3

imagepng

A4

imagepng

A5

imagepng