GROUP BY 的几种用法,其实没你想的那么复杂。ROLLUP、CUBE、GROUPING SETS看着像高阶操作,实则只是在你原有分组的基础上,多加了点组合输出的“套路”。嗯,用对了,它们确实能帮你省不少代码量,尤其是报表时,真挺爽的。
基础的 GROUP BY是最常用的,用来对一列或多列进行分组。比如:
SELECT zt, qylx_dm, SUM(zczb), COUNT(bs)
FROM dj_zt
GROUP BY zt, qylx_dm;
这段代码就按照zt和qylx_dm来分组,统计每组的总注册资本和数量。简单好用,没什么坑。
ROLLUP就像是在原始分组结果后,自动多帮你算个小计和总计:
SELECT zt, qylx_dm, SUM(zczb), COUNT(bs)
FROM dj_zt
GROUP BY ROLLUP(zt, qylx_dm);
结果里不仅有每个zt+qylx_dm的组合,还有按zt的汇总,甚至还有总汇总。对,没你动手,它就自动给了。
CUBE更猛,它会输出所有的组合结果。比如你用:
SELECT zt, qylx_dm, SUM(zczb), COUNT(bs)
FROM dj_zt
GROUP BY CUBE(zt, qylx_dm);
它会给你zt、qylx_dm、zt+qylx_dm,甚至全表总计,通通都有。场景嘛,报表、BI 工具用得多。
是GROUPING SETS,这个比较灵活。你可以自定义要哪些分组组合,比如:
SELECT zt, qylx_dm, SUM(zczb), COUNT(bs)
FROM dj_zt
GROUP BY GROUPING SETS ((zt), (qylx_dm));
只要你写清楚,它就给你算你想要的组合。还能加上()输出总计。适合你想控制显示结构时用。
如果你平时写 SQL 经常需要分组汇总,建议这几个组合技巧你都试试。尤其在写报表、导出数据表格时,真的省心。