MySQL的ROLLUP是一種非常有用的聚合函數(shù),在處理復(fù)雜的數(shù)據(jù)匯總分析時非常實用。ROLLUP可以對多個列進行分組,并生成子匯總和總匯總。
SELECT col1, col2, SUM(col3) FROM tableName GROUP BY col1, ROLLUP(col2);
在上述示例中,我們使用ROLLUP在col2列的基礎(chǔ)上進行匯總,生成子匯總和總匯總。總匯總中,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只能用于固定數(shù)量的列,而且總匯總總是排在最后。及時是有多個ROLLUP函數(shù),總匯總也只有一個。
如果需要進行多維匯總,可以使用GROUPING SETS。GROUPING SETS允許指定一組列來創(chuàng)建不同維度的子匯總和總匯總。
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,從而創(chuàng)建了多個維度的匯總。可以根據(jù)實際需求自定義GROUPING SETS。
在使用ROLLUP和GROUPING SETS時,要特別注意對group by子句的處理。因為GROUP BY中列的排列順序會影響結(jié)果集,如未按正確的順序排列將會得到錯誤的結(jié)果集。
下一篇mysql總和的最大值