SELECT添加全列后GROUP BY失效 无法按supplier_so分组求和
SQL按supplier_so分组并保留全字段的调整方案
你原有SQL的核心问题有两个:
- 把需要聚合的
qty字段加入了GROUP BY子句,直接拆分了分组粒度,导致求和逻辑失效 - 未明确非分组字段在同一个supplier_so下存在多值时的取值规则
以下是两种常用的可行方案:
方案1:窗口函数+行号过滤(灵活控制取值规则)
适合同个supplier_so下非聚合字段存在多值,需要自定义取数规则的场景,示例SQL如下:
WITH so_with_calc AS ( SELECT doc_date, doc_no, site, doc_type, supplier_so, item_code, item_description, -- 按supplier_so分组预计算qty总和 SUM(CAST(qty AS INT)) OVER (PARTITION BY supplier_so) AS qty, item_class, source_filename, -- 同个supplier_so下按自定义规则排序取第一行,这里示例按item_code正序取,可自行调整排序字段 ROW_NUMBER() OVER (PARTITION BY supplier_so ORDER BY item_code) AS row_num FROM table.name WHERE item_code LIKE 'XXX%' AND doc_date = '05/28/2021' ) SELECT doc_date, doc_no, site, doc_type, supplier_so, item_code, item_description, qty, item_class, source_filename FROM so_with_calc WHERE row_num = 1 ORDER BY item_code
方案2:GROUP BY+聚合函数(简单直接)
如果同个supplier_so下所有非聚合字段的取值完全一致,直接移除GROUP BY中的qty字段即可,字段和supplier_so一一对应,不会改变原有分组粒度:
SELECT doc_date, doc_no, site, doc_type, supplier_so, item_code, item_description, sum(CAST(qty AS int)) as qty, item_class, source_filename FROM table.name where item_code like 'XXX%' and doc_date = '05/28/2021' group by supplier_so, doc_no, site, doc_type, doc_date, item_code, item_description, item_class, source_filename order by item_code
如果字段存在多值,可对非聚合字段套聚合函数(比如MAX、MIN,支持ANY_VALUE函数的数据库可以直接用ANY_VALUE取任意值),只保留supplier_so作为分组字段:
SELECT MAX(doc_date) AS doc_date, MAX(doc_no) AS doc_no, MAX(site) AS site, MAX(doc_type) AS doc_type, supplier_so, MAX(item_code) AS item_code, MAX(item_description) AS item_description, SUM(CAST(qty AS INT)) AS qty, MAX(item_class) AS item_class, MAX(source_filename) AS source_filename FROM table.name WHERE item_code LIKE 'XXX%' AND doc_date = '05/28/2021' GROUP BY supplier_so ORDER BY item_code
注意说明
如果你的数据库支持相关特性,也可以用FIRST_VALUE等窗口函数自定义取不同字段的规则,满足更复杂的取数需求。
内容的提问来源于stack exchange,提问作者Helpplease
相关产品推荐
相关产品推荐

