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

MS SQL多表关联查询SUM()聚合仅统计最新记录工时的问题

未完成工单预估工时统计SQL问题解决

问题描述

需要统计每台设备对应未完成工单的预估总工时,需关联change、part、completed三张表获取最新变更记录的工时值。目前已能查询到待求和的工时列表,但尝试使用SUM()函数进行汇总时始终抛出聚合错误,原有SQL代码如下:

SELECT 
(SELECT TOP 1 change.hours 
    FROM change WHERE change.id = part.id
    ORDER BY change.timeStamp DESC) as 'Hours'

FROM change 
INNER JOIN part ON (part.id = change.id)
INNER JOIN  completed ON (part.id = completed.id) 

WHERE part.id NOT IN (SELECT completed.id FROM completed WHERE completed.completed = 1) 
and (SELECT TOP 1 change.machine FROM change WHERE part.id = change.id ORDER BY change.timeStamp DESC ) = :machine

GROUP BY change.id, part.id

预期输出

  • 设备1总工时12小时
  • 设备2总工时18小时
  • 设备3总工时18小时

相关表结构与数据

part表

idnumberdescription(描述)job(工单编号)
1440023-10-100-10-03底座40023
1540023-10-200-10-03底座40023
1640024-10-100-10-01传感器支架40024
1740024-10-100-10-02侧件40024
1840025-10-100-10-01输送机固定件40025
1940025-10-200-00-01零件40025
2040026-10-400-00-01电机安装座40026
2140026-10-200-10-10三角机械臂40026
2240023-10-200-10-03底座40023

change表1

idqty(数量)hours(工时)machine(设备号)operator(操作员)startTime(开始时间)stopTime(结束时间)completed(是否完成)date(日期)timeStamp(时间戳)
140022NULLNULL否NULL2021-10-28 00:00:00.000
150043NULLNULL否NULL2021-10-28 11:01:41.427
190031NULLNULL否NULL2021-10-28 11:10:50.730
180023NULLNULL否NULL2021-10-28 11:13:46.213
1632.522NULLNULL否2021-10-272021-10-28 13:41:12.393
1632.522NULLNULL否2021-10-272021-10-28 13:41:12.393
151933NULLNULL是2021-10-292021-10-28 21:38:44.883
140011NULLNULL否NULL2021-11-01 10:36:43.223
140011NULLNULL否NULL2021-11-01 10:37:47.153
1610.522NULLNULL否2021-11-012021-11-01 11:12:06.840
210011NULLNULL否NULL2021-11-01 11:45:30.050
200023NULLNULL否NULL2021-11-10 10:44:00.000
230000NULLNULL是2021-11-022021-11-02 16:26:18.583
161122NULLNULL否2021-11-012021-11-01 11:03:44.160
170022NULLNULL否NULL2021-10-28 11:25:03.967
170011NULLNULL否NULL2021-11-01 10:40:36.850
170011NULLNULL否NULL2021-11-01 10:42:56.350
220032NULLNULL否NULL2021-11-02 11:58:08.360
170012NULLNULL否NULL2021-11-01 10:43:44.273
140011NULLNULL否NULL2021-11-01 10:44:23.440
140011NULLNULL否NULL2021-11-02 12:57:06.810

change表2

idhours(工时)qty(数量)machine(设备号)operator(操作员)notes(备注)rush(是否加急)timeStamp(时间戳)
142321否2021-10-28 10:48:54.910
1510132否2021-10-28 10:49:47.643
1671023缺料是2021-10-28 10:50:33.880
174211否2021-10-28 00:00:00.000
185122否2021-10-28 10:53:15.470
198333否2021-10-28 11:10:50.573
143411等待铣床否2021-10-29 08:12:00.000
174211是2021-11-01 10:40:36.707
174211是2021-11-01 10:42:56.150
1681023缺料否2021-11-01 10:43:29.930
174212否2021-11-01 10:43:44.047
143411否2021-11-01 10:44:23.317
202423否2021-11-01 11:44:10.257
215311缺料是2021-11-01 11:45:29.927
2210132否2021-11-02 11:58:08.220
143411是2021-11-02 12:57:06.683
144211等待钻头否2021-10-29 00:00:00.000
143411铣床型号错误,需重新采购否2021-11-01 10:36:42.997
143411铣床型号错误,需重新采购否2021-11-01 10:37:46.983

修正方案

原有SQL报错的原因是直接对嵌套子查询的结果聚合时,聚合维度与分组逻辑不匹配。可以先通过窗口函数拿到每个part id对应的最新change记录,再过滤未完成工单后按设备求和,修正后的SQL如下(兼容SQL Server语法,适配你提供的TOP 1写法):

-- 先获取每个part id对应的最新变更工时和所属设备
WITH latest_change AS (
    SELECT 
        id,
        hours,
        machine,
        ROW_NUMBER() OVER (PARTITION BY id ORDER BY timeStamp DESC) AS rn
    FROM change
)
SELECT 
    CONCAT('设备', lc.machine, '总工时', SUM(lc.hours), '小时') AS result
FROM latest_change lc
INNER JOIN part p ON lc.id = p.id
INNER JOIN completed c ON p.id = c.id
WHERE lc.rn = 1 -- 只取最新的变更记录
AND c.completed != 1 -- 过滤未完成工单
GROUP BY lc.machine
ORDER BY lc.machine

如果需要查询单台设备的总工时,直接在WHERE条件中添加lc.machine = :machine即可,返回结果就是对应设备的单值总工时,可直接用于GUI展示。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 19:36:04