高级聚合功能 group by rollup 以及 grouping grouping_id 函数的运用

首先,聚合函数是什么,他是按照分组字段把多行数据处理成一行,常用的6大聚合函数有
max 最大值
min 最小值
sum 累计值
avg 平均值
count 个数统计值 (如果 count(distinct …) 则统计内容不同的数据个数
这里我们主要讲下高级聚合功能 group by rollup 以及 grouping grouping_id 函数
示例,展示每年度下,每个月度的消费总额,单个年度下的月度全部排列出来以后,另起一行展示”年度消费总额”,所有年度排列完以后再另起一行展示“所有年度累计总额”。
如果所示:如果按照简单聚合的方式直接按年和月group by,是不能另起一行生成年度小计和全体总计数据的。
直接group by
加group by rollup , 比直接group by 多了汇总,如果是Group by ROLLUP(A, B, C)的话,首先会对(A、B、C)进行GROUP BY,然后对(A、B)进行GROUP BY,然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作。
直接上图
group by rollup
然后用grouping_id函数对group by rollup的结果返回特定值。
Grouping函数:
可以接受一列,返回0或1。如果列值为空,则返回1,非空则返回0。它只能在rollup和或cube函数中使用,因为在统计中显示“全部”的那一项统计值时,那一项的标签通常是空的,这时grouping就非常有用,还可以在grouping的基础上进行decode, case等进行美化。

Grouping_id函数
比grouping还强点,可以接收多个列,这几个列都不为空时,返回0,只要有一个为空,则返回1,如果都为空,则返回3。
grouping_id
图中可以看到,第三列中,若是年份、月份均不为空,函数返回为0,若是其中一者为空,函数返回1,若是均为空,函数返回3。

这时可以用decode判断式来生成需要的展示结果了
decode(条件,返回值1,值1,返回值2,值2,…返回值n,值n,缺省值)
若是条件与值1符合,则返回 返回值1,以此类推,否则为缺省值(默认值)。
这里多讲一个case when end 条件判断函数,比decode强大。
case when word > number1 then result1
when word > number2 and col1 is not null then result2
when word > number3 or col2 = xx then result3
else other end
—word为被判断字符,当word大于number1时返回result1,若不满足前述条件,大于word2且对应一行的col1字段非空时返回result2,以此类推
—前面都不满足时返回other
—如果不指定除外返回值,则默认空值
—结尾一定要写end不然报错
特点:可以用于多值不等值判断,涵盖decode所有功能
可以结合count使用。
此处第15题有用到,感兴趣的同学可以看一下。

decode
现在总体分析一下。在使用group by rollup(年,月)后,表格会多一个汇总。在次基础上,再使用grouping_id(column1,column2,…),在年度汇总那一行,月份单元格值是空的,所以函数返回值是1,其他情况类似。最后使用decode判断式,进一步完善表格,这样就很简单的把一张报表给完成啦。

猜你喜欢

转载自blog.csdn.net/Marko_Liu/article/details/89185652