Суммирование нескольких строк в объединенном запросе

#sql

#sql

Вопрос:

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

 Table1
JobNumber       CostType      Amount
1               A              10
1               B              20
1               C              50
1               C              50
3               C              75
  
     Table 2
    JobNumber       Status        Value
    1               A             100
    2               I             50
    3               A             75
  

Итак, некоторые задания будут содержать несколько строк для CostType ‘C’. Я пытаюсь отобразить все JobNumber s с общим количеством любых сумм для CostType C, НО только для заданий, которые имеют статус ‘A’. Вот мой запрос до сих пор:

 SELECT Table1.JobNumber
      ,Table1.Amount
      ,Table2.Value
  FROM DB.Table1, DB.Table2
  WHERE Table1.JobNumber = Table2.JobNumber and Table1.CostType = 'C' and Table2.Status = 'A'
  GROUP BY Table1.JobNumber, Table1.Amount, Table2.Value
  ORDER BY Table1.JobNumber ASC
  

Он выдает мне список номеров заданий, их сумм и стоимости контракта, и только для типа затрат «C» и со статусом «A». Но каждая отдельная сумма типа затрат ‘C’ имеет свою собственную строку. Есть ли способ объединить их и отобразить общую сумму вместе со значением для каждого JobNumber, например, так?

 JobNumber     CostTypeCTotal     Value
1             100                100
3             75                 75
  

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

1. Пометьте свой вопрос базой данных, которую вы используете.

Ответ №1:

Хммм … попробуйте выполнить агрегирование table1 перед объединением таблиц:

 SELECT t2.JobNumber, t1.c_Amount, t2.Value
FROM DB.Table2 t2
     (SELECT JobNumber,
             SUM(CASE WHEN CostType = 'C' THEN amount END) as c_amount
      FROM DB.Table1 t1
      GROUP BY JobNumber
      HAVING SUM(CASE WHEN CostType = 'A' THEN 1 ELSE 0 END) > 0
     ) t1 JOIN
     ON t1.JobNumber = t2.JobNumber;
  

Примечание: Научитесь использовать правильный, явный, стандартный, читаемый JOIN синтаксис. Никогда не используйте запятые в FROM предложении. Такое использование , является архаичным синтаксисом, который устарел с 1990-х годов.

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

1. Спасибо за совет. Я не знаю, где я узнал такой древний синтаксис. Что касается вашего ответа, я должен спросить, где мне нужно поменять местами мои фактические имена баз данных? Это каждый экземпляр t1 / t2 и т.д. или только в предложении from ?

2. @GenericITUnprofessional . t1 , , и t2 являются псевдонимами таблиц. Имена таблиц, которые вы указали в своем запросе, — это db.table2 и db.table1 . Это будут имена, которые вы используете.

3. Я думал, что это так. При выполнении запроса я получаю две ошибки: сообщение 156, уровень 15, состояние 1, строка 3 Неправильный синтаксис рядом с ключевым словом ‘SELECT’ Сообщение 102, уровень 15, состояние 1, строка 8 Неправильный синтаксис рядом с ‘)’