【问题标题】:SUM aggregate function and Subquery -SQLSUM 聚合函数和子查询 -SQL
【发布时间】:2011-09-27 17:28:20
【问题描述】:

我使用的是 MS SQL Server,我有 2 个表。

供应清单

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 是 amenity 表中 supply_id 的外键

供应

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

输出应该是supply_id,然后是no。可用单位数等于 No_of_units 减去数量。

输出

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。从 supply_id 16 的 no_of_units 中减去 5,我们将得到 5 的单位可用。

【问题讨论】:

  • @OMG Ponies——感谢编辑:D

标签: sql sql-server stored-procedures aggregate-functions


【解决方案1】:
  • 您将列表表的外部 JOIN 留给了父表
  • 从父 no_of_units 值中减去列表 Qty 值的 SUM
  • 在没有列表行的情况下使用 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- 哎呀..对不起,我真的不知道如何以可理解的格式呈现我的数据,所以我要感谢为我编辑它的人 :)))。关于 MS SQL,我还有很多东西要了解,所以我可能很快就会提出问题。再次感谢! :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 2020-08-05
  • 2014-02-24
  • 1970-01-01
  • 2019-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多