SELECT col1, col2, SUM(col3) FROM tableName GROUP BY col1, ROLLUP(col2);
在上述示例中,大家使用ROLLUP在col2列的基础上进行汇总,生成子汇总和总汇总。总汇总中,col2列将为null,并显示col1的总汇总。
+------+------+-----------+ | col1 | col2 | SUM(col3) | +------+------+-----------+ | A | 1 | 100 | | A | 2 | 200 | | A | NULL | 300 | | B | 1 | 400 | | B | NULL | 400 | | NULL | NULL | 700 | +------+------+-----------+
注意,ROLLUP只能用于固定数量的列,而且总汇总总是排在最后。及时是有多个ROLLUP函数,总汇总也只有一个。
如果需要进行多维汇总,可以使用GROUPING SETS。GROUPING SETS允许指定一组列来创建不同维度的子汇总和总汇总。
SELECT col1,col2,col3,SUM(col4) FROM tableName GROUP BY GROUPING SETS ((col1),(col2),(col3),(col1,col2),(col1,col3),(col2,col3),(col1,col2,col3));
在上述示例中,大家指定了6个GROUPING SETS,从而创建了多个维度的汇总。可以根据实际需求自定义GROUPING SETS。
在使用ROLLUP和GROUPING SETS时,要特别注意对group by子句的处理。因为GROUP BY中列的排列顺序会影响结果集,如未按正确的顺序排列将会得到错误的结果集。