MySQL 8.0中CUBE()函数是否可用?新手使用方法咨询
在MySQL 8.0中使用CUBE()的方法
嘿,作为MySQL新手碰到这个问题太正常啦!先给你明确一下:MySQL 8.0.19版本才开始原生支持GROUP BY CUBE()语法,如果你用的是更早的8.0版本,就没法直接用,得用替代方案。下面分两种情况给你说明:
一、如果你的MySQL版本是8.0.19及以上
直接用GROUP BY CUBE()是完全没问题的,不过你原来的查询里,CUBE生成的合计行中order_dt会显示为NULL,看起来不够直观,咱们可以用COALESCE()函数把NULL替换成更友好的标签,比如“总计”。修改后的查询示例:
SELECT COALESCE(order_dt, '总计') AS order_dt, COALESCE(order_item, '所有商品') AS order_item, COUNT(*) AS CNT FROM starbucks_order GROUP BY CUBE(order_dt, order_item) ORDER BY CASE WHEN order_dt IS NULL THEN 1 ELSE 0 END, order_dt, CASE WHEN order_item IS NULL THEN 1 ELSE 0 END, order_item;
这样输出的结果里,合计行的标签会更清晰,排序也会把明细行放在前面,合计行放在后面。
二、如果你的MySQL版本低于8.0.19
这时候得用UNION ALL来手动模拟CUBE的效果——因为CUBE本质上是生成所有维度组合的分组结果,包括:
- 按
order_dt和order_item的组合分组(明细) - 仅按
order_dt分组(每日总计) - 仅按
order_item分组(每个商品的总计) - 不分组(全局总计)
对应的查询语句如下:
-- 1. 明细数据:按order_dt和order_item分组 SELECT order_dt, order_item, COUNT(*) AS CNT FROM starbucks_order GROUP BY order_dt, order_item UNION ALL -- 2. 每日总计:仅按order_dt分组,order_item标记为'每日总计' SELECT order_dt, '每日总计' AS order_item, COUNT(*) AS CNT FROM starbucks_order GROUP BY order_dt UNION ALL -- 3. 商品总计:仅按order_item分组,order_dt标记为'商品总计' SELECT '商品总计' AS order_dt, order_item, COUNT(*) AS CNT FROM starbucks_order GROUP BY order_item UNION ALL -- 4. 全局总计:不分组,两个字段都标记为'全局总计' SELECT '全局总计' AS order_dt, '全局总计' AS order_item, COUNT(*) AS CNT FROM starbucks_order ORDER BY CASE WHEN order_dt = '全局总计' THEN 4 WHEN order_dt = '商品总计' THEN 3 WHEN order_item = '每日总计' THEN 2 ELSE 1 END, order_dt, order_item;
这个查询通过四次分组查询的结果合并,实现了和CUBE一样的效果,排序规则也保证了结果的可读性。
最后,你可以先运行SELECT VERSION();来确认自己的MySQL版本,再选择对应的方案哦~
内容的提问来源于stack exchange,提问作者kyr_min
相关产品推荐
相关产品推荐

