首页 > 数据库 > 数据库开发技术 > 五种主流数据库:高级分组

-- Oracle、Microsoft SQL Server 以及 PostgreSQL
SELECT dept_id AS "部门编号", sex AS "性别", COUNT(*) AS "员工数量"
FROM employee
GROUP BY ROLLUP (dept_id, sex);
部门编号|性别|员工数量
------|---|-------
1|男 | 3
1| | 3
2|男 | 3
2| | 3
3|女 | 2
3| | 2
4|男 | 8
4|女 | 1
4| | 9
5|男 | 8
5| | 8
| | 25
-- MySQL 和 Microsoft SQL Server
SELECT dept_id AS "部门编号", sex AS "性别", COUNT(*) AS "员工数量"
FROM employee
GROUP BY dept_id, sex WITH ROLLUP;
-- Oracle、Microsoft SQL Server 以及 PostgreSQL
SELECT dept_id AS "部门编号", sex AS "性别", COUNT(*) AS "员工数量"
FROM employee
GROUP BY CUBE (dept_id, sex);
部门编号|性别|员工数量
------|---|-------
1|男 | 3
2|男 | 3
4|男 | 8
5|男 | 8
|男 | 22
3|女 | 2
4|女 | 1
|女 | 3
| | 25
1| | 3
2| | 3
3| | 2
4| | 9
5| | 8
GROUP BY dept_id, sex
GROUP BY GROUPING SETS ((dept_id, sex))
GROUP BY ROLLUP(dept_id, sex)
GROUP BY GROUPING SETS ((dept_id, sex), (dept_id), ())
GROUP BY CUBE(dept_id, sex)
GROUP BY GROUPING SETS ((dept_id, sex), (dept_id), (sex), ())
-- Oracle、Microsoft SQL Server 以及 PostgreSQL
SELECT dept_id AS "部门编号", sex AS "性别", COUNT(*) AS "员工数量"
FROM employee
GROUP BY GROUPING SETS ((dept_id), (sex), ());
部门编号|性别|员工数量
-------|---|-------
| | 25
4| | 9
2| | 3
3| | 2
1| | 3
5| | 8
|男 | 22
|女 | 3
-- Oracle、Microsoft SQL Server 以及 PostgreSQL
SELECT sex AS "性别", COUNT(*) AS "员工数量",
GROUPING(sex) AS "所有性别"
FROM employee
GROUP BY ROLLUP (dept_id, sex);
性别|员工数量|所有性别
---|-------|-------
男 | 22| 0
女 | 3| 0
| 25| 1
-- Oracle、Microsoft SQL Server 以及 PostgreSQL
SELECT CASE GROUPING(sex) WHEN 1 THEN '所有性别' ELSE sex END AS "性别",
COUNT(*) AS "员工数量"
FROM employee
GROUP BY ROLLUP (sex);
性别 |员工数量
-------|------
女 | 3
男 | 22
所有性别| 25
-- MySQL 和 Microsoft SQL Server
SELECT CASE GROUPING(sex) WHEN 1 THEN '所有性别' ELSE sex END AS "性别",
COUNT(*) AS "员工数量"
FROM employee
GROUP BY sex WITH ROLLUP;
saledate |product|channel|amount
----------|-------|-------|-------
2019-01-01|桔子 |淘宝 |1864.00
2019-01-01|桔子 |京东 |1329.00
2019-01-01|桔子 |店面 |1736.00
2019-01-01|香蕉 |淘宝 |1573.00
2019-01-01|香蕉 |京东 |1364.00
2019-01-01|香蕉 |店面 |1178.00
2019-01-01|苹果 |淘宝 | 511.00
2019-01-01|苹果 |京东 | 568.00
2019-01-01|苹果 |店面 | 847.00
...
-- Oracle、Microsoft SQL Server 以及 PostgreSQL
SELECT
CASE GROUPING(product) WHEN 1 THEN '所有产品' ELSE product END AS "产品",
CASE GROUPING(channel) WHEN 1 THEN '所有渠道' ELSE channel END AS "渠道",
SUM(amount) "销售金额"
FROM sales_data
GROUP BY ROLLUP (product, channel)
ORDER BY product, SUM(amount) DESC;
产品 |渠道 |销售金额
------|-------|---------
桔子 |所有渠道| 909261.00
桔子 |京东 | 311799.00
桔子 |淘宝 | 302782.00
桔子 |店面 | 294680.00
苹果 |所有渠道| 937052.00
苹果 |京东 | 318614.00
苹果 |淘宝 | 311795.00
苹果 |店面 | 306643.00
香蕉 |所有渠道| 925369.00
香蕉 |店面 | 311445.00
香蕉 |淘宝 | 307891.00
香蕉 |京东 | 306033.00
所有产品|所有渠道|2771682.00
产品 |渠道 |1 月 |2 月 |3 月 |4 月 |5 月 |6 月 |【合计】
-------|-----|------|------|-------|------|------|------|-------
桔子 |京东 | 41289| 43913| 49803| 49256| 64889| 62649| 311799
桔子 |店面 | 41306| 37906| 48866| 48673| 58998| 58931| 294680
桔子 |淘宝 | 43488| 37598| 48621| 49919| 58530| 64626| 302782
桔子 |- - |126083|119417| 147290|147848|182417| 186206| 909261
苹果 |京东 | 38269| 40593| 56552| 56662| 64493| 62045| 318614
苹果 |店面 | 43845| 40539| 44909| 55646| 56771| 64933| 306643
苹果 |淘宝 | 42969| 43289| 48769| 58052| 58872| 59844| 311795
苹果 |- - |125083|124421| 150230|170360|180136| 186822| 937052
香蕉 |京东 | 36879| 36981| 51748| 54801| 64936| 60688| 306033
香蕉 |店面 | 41210| 39420| 50884| 52085| 60249| 67597| 311445
香蕉 |淘宝 | 42468| 41955| 52780| 54971| 56504| 59213| 307891
香蕉 |- - |120557|118356| 155412|161857|181689| 187498| 925369
【总计】|- - |371723|362194| 452932|480065|544242| 560526|2771682
-- Oracle 和 PostgreSQL
SELECT
CASE GROUPING(product) WHEN 1 THEN '【总计】' ELSE product END AS "产品",
CASE GROUPING(channel) WHEN 1 THEN '--' ELSE channel END AS "渠道",
SUM(CASE EXTRACT(MONTH FROM saledate) WHEN 1 THEN amount END) "1 月",
SUM(CASE EXTRACT(MONTH FROM saledate) WHEN 2 THEN amount END) "2 月",
SUM(CASE EXTRACT(MONTH FROM saledate) WHEN 3 THEN amount END) "3 月",
SUM(CASE EXTRACT(MONTH FROM saledate) WHEN 4 THEN amount END) "4 月",
SUM(CASE EXTRACT(MONTH FROM saledate) WHEN 5 THEN amount END) "5 月",
SUM(CASE EXTRACT(MONTH FROM saledate) WHEN 6 THEN amount END) "6 月",
SUM(amount) "【合计】"
FROM sales_data
GROUP BY ROLLUP (product, channel)
ORDER BY product, channel;
原文作者:SQL编程思想;如有侵权,请联系管理员删除。