MS SQL SUM () с использованием нескольких таблиц и добавлением только последнего записанного значения

#sql #sql-server #sum #ignition

Вопрос:

Я пытаюсь добавить часы, указанные для каждой машины. Мне нужно просмотреть три таблицы, чтобы получить правильные и самые последние данные. Я смог получить список часов, которые мне нужно добавить.

Тем не менее, я пробовал всевозможные способы использования функции 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 часов

ТАБЛИЦЫ

часть

ID число Описание задание
14 40023-10-100-10-03 База 40023
15 40023-10-200-10-03 База 40023
16 40024-10-100-10-01 скобка датчика 40024
17 40024-10-100-10-02 Сторона 40024
18 40025-10-100-10-01 Удержание конвейера 40025
19 40025-10-200-00-01 Часть 40025
20 40026-10-400-00-01 Монтирование двигателя 40026
21 40026-10-200-10-10 Дельта-рычаги 40026
22 40023-10-200-10-03 База 40023

изменить

ID кол-во часов машина оператор Время начала Время остановки Завершено Дата Временная метка
14 0 0 2 2 NULL NULL False NULL 2021-10-28 00:00:00.000
15 0 0 4 3 NULL NULL False NULL 2021-10-28 11:01:41.427
19 0 0 3 1 NULL NULL False NULL 2021-10-28 11:10:50.730
18 0 0 2 3 NULL NULL False NULL 2021-10-28 11:13:46.213
16 3 2.5 2 2 NULL NULL False 2021-10-27 2021-10-28 13:41:12.393
16 3 2.5 2 2 NULL NULL False 2021-10-27 2021-10-28 13:41:12.393
15 1 9 3 3 NULL NULL True 2021-10-29 2021-10-28 21:38:44.883
14 0 0 1 1 NULL NULL False NULL 2021-11-01 10:36:43.223
14 0 0 1 1 NULL NULL False NULL 2021-11-01 10:37:47.153
16 1 0.5 2 2 NULL NULL False 2021-11-01 2021-11-01 11:12:06.840
21 0 0 1 1 NULL NULL False NULL 2021-11-01 11:45:30.050
20 0 0 2 3 NULL NULL False NULL 2021-11-10 10:44:00.000
23 0 0 0 0 NULL NULL True 2021-11-02 2021-11-02 16:26:18.583
16 1 1 2 2 NULL NULL False 2021-11-01 2021-11-01 11:03:44.160
17 0 0 2 2 NULL NULL False NULL 2021-10-28 11:25:03.967
17 0 0 1 1 NULL NULL False NULL 2021-11-01 10:40:36.850
17 0 0 1 1 NULL NULL False NULL 2021-11-01 10:42:56.350
22 0 0 3 2 NULL NULL False NULL 2021-11-02 11:58:08.360
17 0 0 1 2 NULL NULL False NULL 2021-11-01 10:43:44.273
14 0 0 1 1 NULL NULL False NULL 2021-11-01 10:44:23.440
14 0 0 1 1 NULL NULL False NULL 2021-11-02 12:57:06.810

change

id hours qty machine operator notes rush timeStamp
14 2 3 2 1 False 2021-10-28 10:48:54.910
15 10 1 3 2 False 2021-10-28 10:49:47.643
16 7 10 2 3 Нужен материал Верно 2021-10-28 10:50:33.880
17 4 2 1 1 False 2021-10-28 00:00:00.000
18 5 1 2 2 False 2021-10-28 10:53:15.470
19 8 3 3 3 False 2021-10-28 11:10:50.573
14 3 4 1 1 ожидание mills False 2021-10-29 08:12:00.000
17 4 2 1 1 Верно 2021-11-01 10:40:36.707
17 4 2 1 1 Верно 2021-11-01 10:42:56.150
16 8 10 2 3 Нужен материал False 2021-11-01 10:43:29.930
17 4 2 1 2 False 2021-11-01 10:43:44.047
14 3 4 1 1 False 2021-11-01 10:44:23.317
20 2 4 2 3 False 2021-11-01 11:44:10.257
21 5 3 1 1 Нужен материал Верно 2021-11-01 11:45:29.927
22 10 1 3 2 False 2021-11-02 11:58:08.220
14 3 4 1 1 Верно 2021-11-02 12:57:06.683
14 4 2 1 1 ожидание битов False 2021-10-29 00:00:00.000
14 3 4 1 1 пришли неправильные мельницы. Необходимо заказать другие False 2021-11-01 10:36:42.997
14 3 4 1 1 пришли неправильные мельницы. Необходимо заказать другие False 2021-11-01 10:37:46.983

Комментарии:

1. Было бы здорово, если бы вы вставили в вопрос примеры данных для каждой из таблиц. И ожидаемый результат, который вы должны вставить в виде текста, а не изображения. Таким образом, я уверен, что мы могли бы вам помочь.

2. Я только что сделал.

3. Вы вставили изображения, но вы должны вставить текст, чтобы мы могли скопировать и вставить его. В таблице «Часть» я вижу имена полей, но в двух других я не вижу. Наконец, вы также должны вставить ожидаемые результаты для запроса, пожалуйста. Спасибо

4. Я думаю, у меня есть все, что вам нужно

5. Я не могу вычислить ожидаемые результаты с использованием выборочных данных. Как вы рассчитываете 12 часов для машины 1? Я предполагаю, что вторая таблица «завершена», а не «часть», и у вас есть поле «часы» в обеих таблицах. Ни один из них не суммирует 12 для машины 1. Мне нужно больше объяснений о том, как вы вычисляете ожидаемые результаты, пожалуйста.

Ответ №1:

Ну, я не могу понять, как вы вычисляете ожидаемые результаты, и я уверен, что ваш запрос можно значительно улучшить (если вы лучше объясните свои требования, я могу помочь вам улучшить его). Между тем, этот запрос возвращает то, что вы хотите:

 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
 

Возвращает:

машина Часов
1 12
2 18
3 18

DBFiddle: https://dbfiddle.uk/?rdbms=sqlserver_2019amp;fiddle=80ab33a349388896af3ffcb8954c56c9

Ответ №2:

Отличная работа, Карлос.

Я смог добавить в ваш код, чтобы получить нужные мне результаты

Существует ввод того, какой компьютер отображается. : машина — это входные данные.

 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)
 

Комментарии:

1. если мой ответ был полезен, не забудьте проголосовать за него и / или пометить его как правильный ответ, пожалуйста