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

SQL Server 2008修改分组小计行标题及小计显示异常求助

解决SQL Server 2008分组小计行标题显示问题

看起来你是在用GROUPING SETS做多维度统计,但没正确区分明细行、商品类型小计行和总计行,导致本该显示“Total QTY:”的小计行只显示了商品类型名称。下面是针对你需求的修改方案:

修改后的查询语句

SELECT 
    [GOODS_TYPE] = CASE
        -- 识别总计行:_TYPE_NAME被聚合,返回1
        WHEN GROUPING([_TYPE_NAME]) = 1 THEN 'GRAND_TOTAL'
        -- 识别商品类型小计行:GOODS_CODE被聚合,返回1
        WHEN GROUPING([GOODS_CODE]) = 1 THEN 'Total QTY: ' + [_TYPE_NAME]
        -- 明细行:直接显示商品类型名称
        ELSE [_TYPE_NAME]
    END,
    b.GOODS_CODE,
    b.GOODSNAME,
    a.CURRENCY,
    a.CUSTOMER_CD,
    a.INVOICE_DATE,
    [QUANTITY] = SUM([QTY]) 
From [DVHead] a 
inner join [DVRecords] b on a.DELIVERYNO = b.DELIVERYNO 
WHERE a.INVOICE_DATE = '2018-05-04' 
GROUP BY GROUPING SETS(
    -- 明细行维度:完整的分组字段
    ([_TYPE_NAME], [GOODS_CODE], [GOODSNAME], a.CURRENCY, a.CUSTOMER_CD, a.INVOICE_DATE),
    -- 商品类型小计维度:仅按类型及公共维度分组
    ([_TYPE_NAME], a.CURRENCY, a.CUSTOMER_CD, a.INVOICE_DATE),
    -- 总计维度:仅公共维度,聚合所有数据
    (a.CURRENCY, a.CUSTOMER_CD, a.INVOICE_DATE)
)
ORDER BY 
    -- 按商品类型排序,保证同类型数据聚在一起
    [_TYPE_NAME],
    -- 让明细行在前,小计行在后(GOODS_CODE为NULL的是小计行)
    CASE WHEN GROUPING([GOODS_CODE]) = 1 THEN 1 ELSE 0 END

关键逻辑说明

  1. GROUPING()函数的核心作用:

    • 这个函数专门用来判断当前行中某列是否属于分组聚合的维度:如果该列被聚合(值为NULL),返回1;否则返回0。
    • 我们通过它精准区分三种行:
      • 总计行:GROUPING([_TYPE_NAME]) = 1,所有商品类型的汇总
      • 类型小计行:GROUPING([GOODS_CODE]) = 1,单类型下所有商品的汇总
      • 明细行:其余情况,单个商品的统计
  2. GROUPING SETS的完整性:

    • 我补充了完整的分组集合,确保生成你需要的三种行类型。如果你的原始查询还有其他分组字段,记得同步调整到对应的分组集合中。
  3. 排序优化:

    • 添加的ORDER BY子句让结果更清晰:同类型的明细行在前,小计行紧随其后,最后是所有数据的总计行。

额外注意

  • 如果[_TYPE_NAME]列本身存在NULL值,需要在CASE语句里额外处理(比如加上ELSE ISNULL([_TYPE_NAME], '未知类型'))
  • SQL Server 2008完全支持GROUPING()和GROUPING SETS,这个方案可以直接运行

内容的提问来源于stack exchange,提问作者Cát Tường Vy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:33:52