【问题标题】:Comparing the value of a field in one table to the sum of multiple fields in another table将一个表中的一个字段的值与另一个表中多个字段的总和进行比较
【发布时间】:2012-06-04 11:49:00
【问题描述】:

我有两张桌子

  • 包装表:packageid、数量
  • 交易表:transactionid、packageid、数量

每当获得“package”时,都会在“transactions”表中创建一个条目以及获得的数量。可以执行多次'transactions',并且当包裹完全获得时,该包裹的所有交易的总和应该等于包裹表中该包裹的数量。

我想写一个SQL语句来检查一个特定的packageid是否没有被完全获取到,即:

  1. 未执行任何事务
  2. 已执行交易,但所有交易的数量总和 交易少于包裹表中的数量

我怎样才能做到这一点?我尝试使用的每个加入都只为 2 号提供服务,但不考虑没有交易的包裹

我试过了:

select package.packageid, package.quantity, sum(transactions.quantity) from package join transactions on package.packageid = transactions.packageid where package.quantity > sum(transactions.quantity)

也尝试了左连接,但它不起作用。理想情况下,我希望结果中左侧表中列出的所有包在必要时右侧为空值

【问题讨论】:

  • select package.packageid, package.quantity, sum(transactions.quantity) from package join transactions on package.packageid = transactions.packageid where package.quantity > sum(transactions.quantity) 也尝试了左连接,但它不起作用。理想情况下,我希望左表中列出的所有包都需要右表中的空值
  • @AbcdfpqVpn 把它放在问题中。

标签: mysql sql join


【解决方案1】:

如果你想包含没有交易的包,那么你需要left outer join。这将保留结果中的所有包并匹配存在事务的事务。

那么你需要group bypackage.packageid,这样你的sum操作只对属于某个packageidtransactions记录有效。

然后你使用having clause,它类似于 where 子句,只是它适用于像 sum 这样的聚合函数。

select
  p.packageid,
  p.quantity,
  sum(t.quantity) as transaction_sum
from
  packages p
  left outer join transactions t on (t.packageid = p.packageid)
group by
  p.packageid,
  p.quantity
having
  coalesce(sum(t.quantity), 0) != p.quantity
;

合并只是说,“取第一个非空值。”因此,如果sum(t.quantity) 返回null,那么它将使用0。这将确保结果集中包含有数量但没有交易的包裹。

我建议您阅读有关 group by 和 having 的内容。在使用 sql 时,它们是必不可少的。从本质上讲,分组依据是根据数据的共同标准将您的数据分成几组。然后根据组的质量过滤掉某些结果。

【讨论】:

  • 这.. 真的有效你能解释最后两行(有 & 合并)吗?他们是如何帮助实现这一结果的?谢谢
  • @AbcdfpqVpn 另外,如果这个答案对您有帮助,您介意点击我的答案左侧的接受复选标记。除了向您和我添加一点代表之外,还可以让未来的读者知道这个答案可以解决您的问题。
猜你喜欢
  • 2016-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多