-
GROUPING SETS: 根据不同的维度组合进行聚合,等价于将不同维度的GROUP BY结果集进行UNION ALL
-
GROUPING__ID:表示结果属于哪一个分组集合,属于虚字段
-
CUBE: 根据GROUP BY的维度的所有组合进行聚合。
-
ROLLUP: 为CUBE的子集,以最左侧的维度为主,从该维度进行层级聚合。
关于grouping sets的使用,我是参考这篇博客学习的,感觉讲的很清楚 网址链接
通俗的说,grouping sets是一种将多个group by 逻辑写在一个sql语句中的便利写法。
select
A,
B,
C,
group_id,
count(A)
from
tableName
group by --declare columns
A,
B,
C
grouping sets
(
(A,C),
(A,B),
(B,C),
(C)
)
其中grouping sets中的(A,C), (A,B), (B,C), (C) 代表4个group by 组合, 相当于写了四个sql查询语句使用了四个不同的group by策略。
group_id是为了区分每条输出结果是属于哪一个group by的数据。它是根据group by后面声明的顺序字段是否存在于当前group by中的一个二进制位组合数据。 比如(A,C)的group_id: group_id(A,C) = grouping(A)+grouping(B)+grouping (C) 的结果就是:二进制:101 也就是5.
select中的字段是完整的A,B,C,但是我们知道由于group by的存在,select 字段本不应该出现非group by字段的,所以这里我们要特别说明,如果解释器发现group by A,C 但是select A,B,C 那么运行时会将所有from 表取出的结果复制一份,B都置为null,也就是在结果中,B都为null。
1、对所有明细数据按年份、月份、年月,三者分别汇总,获取其汇总结果
select year,month,sum(cost) AS all_cost,GROUPING__ID from
(
SELECT year(orderdatetime) as year,
month(orderdatetime) as month,
cost
FROM analysis_daily_expense
) middle
GROUP BY year,month
GROUPING SETS (year,month,(year,month))
ORDER BY GROUPING__ID;
运行结果如下: