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
关键逻辑说明
GROUPING()函数的核心作用:- 这个函数专门用来判断当前行中某列是否属于分组聚合的维度:如果该列被聚合(值为NULL),返回
1;否则返回0。 - 我们通过它精准区分三种行:
- 总计行:
GROUPING([_TYPE_NAME]) = 1,所有商品类型的汇总 - 类型小计行:
GROUPING([GOODS_CODE]) = 1,单类型下所有商品的汇总 - 明细行:其余情况,单个商品的统计
- 总计行:
- 这个函数专门用来判断当前行中某列是否属于分组聚合的维度:如果该列被聚合(值为NULL),返回
GROUPING SETS的完整性:
- 我补充了完整的分组集合,确保生成你需要的三种行类型。如果你的原始查询还有其他分组字段,记得同步调整到对应的分组集合中。
排序优化:
- 添加的
ORDER BY子句让结果更清晰:同类型的明细行在前,小计行紧随其后,最后是所有数据的总计行。
- 添加的
额外注意
- 如果
[_TYPE_NAME]列本身存在NULL值,需要在CASE语句里额外处理(比如加上ELSE ISNULL([_TYPE_NAME], '未知类型')) - SQL Server 2008完全支持
GROUPING()和GROUPING SETS,这个方案可以直接运行
内容的提问来源于stack exchange,提问作者Cát Tường Vy
相关产品推荐
相关产品推荐

