You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 03:35:17