【问题】
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
A3
A4
A5