SQL Server指定列聚合统计时如何同步展示关联明细
问题根因
你原SQL的逻辑断点在最外层聚合层:
- 最外层子查询仅按
machine分组,只返回machine和计算的job_q两个字段 - 所有原始明细字段(order_no、product_no、machine_name等)都会被聚合操作折叠丢弃,自然无法在结果中带出
解决方案
SQL Server 2008及以上版本直接使用窗口函数实现,无需折叠明细行,即可按机台分组计算聚合计数,并把计数值作为列附加到每一行明细上,完全匹配"明细+同组聚合值"的输出需求。
核心逻辑是使用OVER (PARTITION BY 分组字段)语法,在不触发全局group by折叠的前提下,按指定分组范围计算聚合值,完全保留原有计数口径(即按机台统计记录数后减1)。
修正后的完整查询语句:
SELECT ab.order_no, ast.machine AS machine_no, product_no, machine_name, -- 按机台范围统计明细行数,保留原count-1的计算逻辑 COUNT(*) OVER (PARTITION BY ast.machine) - 1 AS job_q FROM table_ab ab LEFT JOIN table_ast ast ON ab.order_no = ast.order_no WHERE ab.order_no LIKE 'MO%' AND ast.machine IN ('MH6', 'M5X') AND ast.machine NOT LIKE 'OEM%' AND machine_name NOT LIKE 'PP2%' AND psd > '2021-01-17 00:00:00.000' AND ab.machine IS NOT NULL -- 保留你原逻辑中的去重规则,避免重复行导致计数偏差 GROUP BY ab.order_no, ast.machine, product_no, machine_name, quantity, psd, ped, esd, time_1, eed, eet ORDER BY ast.machine;
兼容旧版本的替代方案:如果使用的是不支持窗口函数的老旧SQL Server版本,可以先单独编写按machine计算job_q的聚合子查询,再将该结果与去重后的明细集合通过machine字段内连接,最终也能得到同样的结果,只是写法多一层关联,性能略低于窗口函数实现。
内容的提问来源于stack exchange,提问作者schenker
相关产品推荐
相关产品推荐

