简体   繁体   English

MS SQL SUM() 使用多个表并仅添加最后记录的值

[英]MS SQL SUM() using multiple tables and adding only last recorded value

I am trying to add hours quoted per machine.我正在尝试添加每台机器引用的小时数。 I have to look at three tables to get the correct and most recent data.我必须查看三个表才能获得正确的最新数据。 I was able to get a list of the hours I need to add.我能够获得需要添加的小时数列表。

However, I tried all kinds of ways to use a SUM() function but it always gives me aggregate errors.但是,我尝试了各种方法来使用 SUM() 函数,但它总是给我带来聚合错误。

Here is the SQL Code:这是 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

I basically need to single-cell result that will add all the hours per machine.我基本上需要单细胞结果,这将增加每台机器的所有小时数。 The result will be displayed on GUI.结果将显示在 GUI 上。

RESULT SHOULD BE Machine 1 has to be 12 hours Machine 2 has to be 18 hours Machine 3 has to be 18 hours结果应该是机器 1 必须是 12 小时 机器 2 必须是 18 小时 机器 3 必须是 18 小时

TABLES

part部分

id ID number数字 description描述 job工作
14 14 40023-10-100-10-03 40023-10-100-10-03 Base根据 40023 40023
15 15 40023-10-200-10-03 40023-10-200-10-03 Base根据 40023 40023
16 16 40024-10-100-10-01 40024-10-100-10-01 sensor bracket传感器支架 40024 40024
17 17 40024-10-100-10-02 40024-10-100-10-02 Side 40024 40024
18 18 40025-10-100-10-01 40025-10-100-10-01 Conveyor hold输送机保持 40025 40025
19 19 40025-10-200-00-01 40025-10-200-00-01 Part部分 40025 40025
20 20 40026-10-400-00-01 40026-10-400-00-01 Motor Mount马达安装座 40026 40026
21 21 40026-10-200-10-10 40026-10-200-10-10 Delta arms三角臂 40026 40026
22 22 40023-10-200-10-03 40023-10-200-10-03 Base根据 40023 40023

change改变

id ID qty数量 hours小时 machine机器 operator操作员 startTime开始时间 stopTime停止时间 completed完全的 date日期 timeStamp时间戳
14 14 0 0 0 0 2 2 2 2 NULL空值 NULL空值 False错误的 NULL空值 2021-10-28 00:00:00.000 2021-10-28 00:00:00.000
15 15 0 0 0 0 4 4 3 3 NULL空值 NULL空值 False错误的 NULL空值 2021-10-28 11:01:41.427 2021-10-28 11:01:41.427
19 19 0 0 0 0 3 3 1 1 NULL空值 NULL空值 False错误的 NULL空值 2021-10-28 11:10:50.730 2021-10-28 11:10:50.730
18 18 0 0 0 0 2 2 3 3 NULL空值 NULL空值 False错误的 NULL空值 2021-10-28 11:13:46.213 2021-10-28 11:13:46.213
16 16 3 3 2.5 2.5 2 2 2 2 NULL空值 NULL空值 False错误的 2021-10-27 2021-10-27 2021-10-28 13:41:12.393 2021-10-28 13:41:12.393
16 16 3 3 2.5 2.5 2 2 2 2 NULL空值 NULL空值 False错误的 2021-10-27 2021-10-27 2021-10-28 13:41:12.393 2021-10-28 13:41:12.393
15 15 1 1 9 9 3 3 3 3 NULL空值 NULL空值 True真的 2021-10-29 2021-10-29 2021-10-28 21:38:44.883 2021-10-28 21:38:44.883
14 14 0 0 0 0 1 1 1 1 NULL空值 NULL空值 False错误的 NULL空值 2021-11-01 10:36:43.223 2021-11-01 10:36:43.223
14 14 0 0 0 0 1 1 1 1 NULL空值 NULL空值 False错误的 NULL空值 2021-11-01 10:37:47.153 2021-11-01 10:37:47.153
16 16 1 1 0.5 0.5 2 2 2 2 NULL空值 NULL空值 False错误的 2021-11-01 2021-11-01 2021-11-01 11:12:06.840 2021-11-01 11:12:06.840
21 21 0 0 0 0 1 1 1 1 NULL空值 NULL空值 False错误的 NULL空值 2021-11-01 11:45:30.050 2021-11-01 11:45:30.050
20 20 0 0 0 0 2 2 3 3 NULL空值 NULL空值 False错误的 NULL空值 2021-11-10 10:44:00.000 2021-11-10 10:44:00.000
23 23 0 0 0 0 0 0 0 0 NULL空值 NULL空值 True真的 2021-11-02 2021-11-02 2021-11-02 16:26:18.583 2021-11-02 16:26:18.583
16 16 1 1 1 1 2 2 2 2 NULL空值 NULL空值 False错误的 2021-11-01 2021-11-01 2021-11-01 11:03:44.160 2021-11-01 11:03:44.160
17 17 0 0 0 0 2 2 2 2 NULL空值 NULL空值 False错误的 NULL空值 2021-10-28 11:25:03.967 2021-10-28 11:25:03.967
17 17 0 0 0 0 1 1 1 1 NULL空值 NULL空值 False错误的 NULL空值 2021-11-01 10:40:36.850 2021-11-01 10:40:36.850
17 17 0 0 0 0 1 1 1 1 NULL空值 NULL空值 False错误的 NULL空值 2021-11-01 10:42:56.350 2021-11-01 10:42:56.350
22 22 0 0 0 0 3 3 2 2 NULL空值 NULL空值 False错误的 NULL空值 2021-11-02 11:58:08.360 2021-11-02 11:58:08.360
17 17 0 0 0 0 1 1 2 2 NULL空值 NULL空值 False错误的 NULL空值 2021-11-01 10:43:44.273 2021-11-01 10:43:44.273
14 14 0 0 0 0 1 1 1 1 NULL空值 NULL空值 False错误的 NULL空值 2021-11-01 10:44:23.440 2021-11-01 10:44:23.440
14 14 0 0 0 0 1 1 1 1 NULL空值 NULL空值 False错误的 NULL空值 2021-11-02 12:57:06.810 2021-11-02 12:57:06.810

change改变

id ID hours小时 qty数量 machine机器 operator操作员 notes笔记 rush匆忙 timeStamp时间戳
14 14 2 2 3 3 2 2 1 1 False错误的 2021-10-28 10:48:54.910 2021-10-28 10:48:54.910
15 15 10 10 1 1 3 3 2 2 False错误的 2021-10-28 10:49:47.643 2021-10-28 10:49:47.643
16 16 7 7 10 10 2 2 3 3 Need material需要材料 True真的 2021-10-28 10:50:33.880 2021-10-28 10:50:33.880
17 17 4 4 2 2 1 1 1 1 False错误的 2021-10-28 00:00:00.000 2021-10-28 00:00:00.000
18 18 5 5 1 1 2 2 2 2 False错误的 2021-10-28 10:53:15.470 2021-10-28 10:53:15.470
19 19 8 8 3 3 3 3 3 3 False错误的 2021-10-28 11:10:50.573 2021-10-28 11:10:50.573
14 14 3 3 4 4 1 1 1 1 waiting for mills等待磨坊 False错误的 2021-10-29 08:12:00.000 2021-10-29 08:12:00.000
17 17 4 4 2 2 1 1 1 1 True真的 2021-11-01 10:40:36.707 2021-11-01 10:40:36.707
17 17 4 4 2 2 1 1 1 1 True真的 2021-11-01 10:42:56.150 2021-11-01 10:42:56.150
16 16 8 8 10 10 2 2 3 3 Need material需要材料 False错误的 2021-11-01 10:43:29.930 2021-11-01 10:43:29.930
17 17 4 4 2 2 1 1 2 2 False错误的 2021-11-01 10:43:44.047 2021-11-01 10:43:44.047
14 14 3 3 4 4 1 1 1 1 False错误的 2021-11-01 10:44:23.317 2021-11-01 10:44:23.317
20 20 2 2 4 4 2 2 3 3 False错误的 2021-11-01 11:44:10.257 2021-11-01 11:44:10.257
21 21 5 5 3 3 1 1 1 1 Need material需要材料 True真的 2021-11-01 11:45:29.927 2021-11-01 11:45:29.927
22 22 10 10 1 1 3 3 2 2 False错误的 2021-11-02 11:58:08.220 2021-11-02 11:58:08.220
14 14 3 3 4 4 1 1 1 1 True真的 2021-11-02 12:57:06.683 2021-11-02 12:57:06.683
14 14 4 4 2 2 1 1 1 1 waiting for bits等待位 False错误的 2021-10-29 00:00:00.000 2021-10-29 00:00:00.000
14 14 3 3 4 4 1 1 1 1 wrong mills came.错误的工厂来了。 Need to order another ones需要订购另一个 False错误的 2021-11-01 10:36:42.997 2021-11-01 10:36:42.997
14 14 3 3 4 4 1 1 1 1 wrong mills came.错误的工厂来了。 Need to order another ones需要订购另一个 False错误的 2021-11-01 10:37:46.983 2021-11-01 10:37:46.983

Well, I cannot understand how do you calculate the expected results and I am sure your query can be improved a lot (if you explain better your requirements, I can help you to improve it).好吧,我不明白你是如何计算预期结果的,我相信你的查询可以改进很多(如果你更好地解释你的要求,我可以帮助你改进它)。 Meanwhile, this query returns what you want:同时,此查询返回您想要的内容:

select machine, sum(Hours) Hours from (
SELECT change.machine,
(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) 
GROUP BY change.id, part.id, change.machine
) as a 
group by machine

It returns:它返回:

machine机器 Hours小时
1 1 12 12
2 2 18 18
3 3 18 18

DBFiddle: https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=80ab33a349388896af3ffcb8954c56c9 DBFiddle: https ://dbfiddle.uk/ ? rdbms = sqlserver_2019 & fiddle = 80ab33a349388896af3ffcb8954c56c9

That's great work, Carlos.这是伟大的工作,卡洛斯。

I was able to add to your code to get the results I need我能够添加到您的代码中以获得我需要的结果

There is input of which machine is displaying.有显示哪台机器的输入。 :machine is the input. :machine 是输入。

SELECT ISNULL((
SELECT sum(Hours)
FROM (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) as a), 0)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM