SUM агрегатная функция и подзапрос -SQL - PullRequest
2 голосов
/ 03 июля 2011

Я использую MS SQL Server и у меня есть 2 таблицы.

Supply_list

sl_id(pk) supply_id(fk)*       transaction_id    Qty 
1             14               872670099         3 
2             15               872670100         5 
3             16               872670101         1 
4             16               872670105         4 <
  • supply_id является внешним ключом для supply_id в таблице удобств

Поставка

supply_id(pk)    no_of_units 
----------------------------
13               2 
14               3
15               6
16               10

Выходные данные должны быть supply_id, а затем no. доступных единиц, что равно No_of_units, вычитаемому Qty.

выход

id      units available 
-------------------------
13           2 
14           0 --> [1]
15           1
16           5 --> [2]

[1] Поскольку на основе таблицы supply_list в поле supply_id 14 указывается 3 для Qty

[2] Есть две записи, которые содержат supply_id 16, поэтому мы должны добавить их qty, которые равны 4 и 1, поэтому у нас есть 5. И эти 5 будут вычтены из no_of_units of supply_id 16, и мы получим 5 для единиц имеется.

1 Ответ

3 голосов
/ 03 июля 2011
  • Вы оставили внешнюю ПРИСОЕДИНЕНИЕ таблицы списка к родительской таблице
  • Вычтите СУММУ списка значений Qty из родительского значения no_of_units
  • Используйте ISNULL, если списка нетстроки

что-то вроде

SELECT
   S.supply_id,
   S.no_of_units - ISNULL(SUM(SL.Qty), 0) AS [units available]
FROM
   supply S
   LEFT JOIN
   supply_list SL ON S.supply_id = SL.supply_id
GROUP BY
   S.supply_id, S.no_of_units

Это делает совокупность более очевидной, но это тот же запрос

SELECT
   S.supply_id,
   S.no_of_units - ISNULL(SL.SumListQty, 0) AS [units available]
FROM
   supply S
   LEFT JOIN
   (
   SELECT supply_id, SUM(Qty) AS SumListQty
   FROM supply_list
   GROUP BY supply_id
   ) SL ON S.supply_id = SL.supply_id
...