求和聚合函数和子查询-SQL

求和聚合函数和子查询-SQL,sql,sql-server,stored-procedures,aggregate-functions,Sql,Sql Server,Stored Procedures,Aggregate Functions,我正在使用MS SQL Server,我有两个表 供应清单 sl_id(pk) supply_id(fk)* transaction_id Qty 1 14 872670099 3 2 15 872670100 5 3 16 872670101 1 4

我正在使用MS SQL Server,我有两个表

供应清单

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,然后是可用的单位数量,等于单位数量减去数量

输出

id      units available 
-------------------------
13           2 
14           0 --> [1]
15           1
16           5 --> [2]
[1] 因为基于supply_list表,supply_id 14的数量为3

[2] 有两个记录包含supply_id 16,因此我们必须添加它们的数量,即4和1,因此我们有5。5将从16号供应单位中减去,我们将得到5个可用单位。

  • 您留下了将列表表连接到父表的外部连接
  • 从父项“数量单位”值减去列表数量值之和
  • 如果没有列表行,请使用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

这太完美了!非常感谢D@mmm:您提出了一个简单明了的问题,逻辑清晰,数据示例丰富(但请检查它是如何编辑格式的)。很清楚你想要什么。请保持下去!(其他人的一些问题非常糟糕)@gbn-Oops..对不起,我真的不知道如何以一种可以理解的格式展示我的数据,所以我要感谢为我编辑数据的人:))。关于MS SQL,我还有很多事情要知道,所以我可能很快会问一些问题。再次感谢!:D@OMG小马——谢谢你的编辑:D
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