如何用IF与GROUPING函数消除ROLLUP查询中的空值?
用IF和GROUPING函数替换ROLLUP汇总行的空值
你的原SQL已经实现了按分类、产品分组统计采购数量,并通过WITH ROLLUP生成了汇总行,但汇总行的category_name和product_name会显示空值。可以通过GROUPING函数判断当前行是否为汇总行,再结合IF函数替换空值为指定字面量,修改后的SQL如下:
SELECT -- 处理分类名称:如果是全局总计行,显示"所有分类总计",否则显示原分类名 IF(GROUPING(categories.category_name) = 1, '所有分类总计', categories.category_name) AS category_name, -- 处理产品名称: -- 1. 如果是产品级汇总行且不是全局总计,显示"该分类小计" -- 2. 如果是全局总计行,显示"所有产品总计" -- 3. 否则显示原产品名 IF(GROUPING(products.product_name) = 1, IF(GROUPING(categories.category_name) = 1, '所有产品总计', '该分类小计'), products.product_name ) AS product_name, SUM(order_items.quantity) AS total_qty_purchased FROM categories INNER JOIN products ON products.category_id = categories.category_id INNER JOIN order_items ON order_items.product_id = products.product_id GROUP BY categories.category_name, products.product_name WITH ROLLUP;
关键函数说明
GROUPING(column):专门配合WITH ROLLUP使用的函数,当当前行是基于该列生成的汇总行时返回1,否则返回0。- 两层
IF嵌套用于区分两类汇总行:- 当
GROUPING(categories.category_name) = 1时,是最顶层的全局总计行,此时分类和产品名称都替换为全局总计的字面量。 - 当
GROUPING(products.product_name) = 1但GROUPING(categories.category_name) = 0时,是单个分类下的产品汇总行,仅替换产品名称为分类小计的字面量。
- 当
内容的提问来源于stack exchange,提问作者sunny06
相关产品推荐
相关产品推荐

