主要聚合函数有几个:
MAX,MIN,AVG,SUM,COUNT.主要还是联合起来用比较复杂,但看都简单。这几个aggregating函数都对空值忽略。
1.求所有员工平均值
有个典型的例子是求平均值,如果你直接使用
Select avg(bonus) from emp;
得到的结果将会是那些得到奖励的人中的平均奖励额。而老板要求的是统计出全公司所有员工的奖励平均额。这是你应该使用NVL函数来把那些没有拿到奖励的员工也强行加入进来。
例如:
Select avg(NVL(bonus,0)) from emp;
2.group by的使用
使用aggregating函数必须使用group by,如果select 语句中有字段但是没有出现在group by中就会报错!会提示不是group by表达式。
Any column or expression in the select list that is not an aggregate function must be in the group。最近做webi报表也是用到了group by就十分方便。因为webi中是不能自动帮你做时间维度的层级关系,必须自己做。如果表中只有最细粒度的时间,如果做年,月,日维度的钻取了?我就用到了group by,将时间截取到月在group by substr(date,1,6)即可达到月份的聚合。
3. 对聚合的限制having
如果我们相对聚合进行限制如何做了?
select department_id,AVG(salary)
from employess
where AVG(salary) > 8000
group by department_id。
是不对的,必须用having。如下例子:
select bzirk,avg(zzfkimg)
from s901
where sptag = '20041010'
group by bzirk
having avg(zzfkimg) > 100;
不过这种语句在abap中几乎没有用到,abap写的报表全部都是展示数据没有对数据进行筛选。bo的报表中估计用的多的也是alert。
4. nesting group functions
嵌套估计用的更少,如下:
select count(distinct bukrs)
from t001
where bukrs = '1000';
这个如果不加上distinct的话有几个client就有几个值,加上了distinct就只有一个值。
下面又是一个例子:
Select max(avg(zzfkimg))
from s901
where sptag = '20041010'
group by bzirk;
我平常使用嵌套两层是最多了。