比较一个表中字段的值与另一个表中多个字段的总和

时间:2012-06-04 03:14:35

标签: mysql sql join

我有两张桌子

  • 包表:packageid,数量
  • 交易表:transactionid,packageid,数量

只要获得“package”,就会在“transactions”表格中输入一个条目以及获得的数量。可以执行多个“transactions”,当完全获取包时,该包的所有事务的总和应该等于包表中该包的数量。

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

  1. 未执行任何交易
  2. 执行了交易但是所有数量的总和 交易少于包表中的数量
  3. 我怎样才能做到这一点?我尝试使用的每个联接仅适用于2号但不考虑没有交易的包

    我试过了:

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

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

1 个答案:

答案 0 :(得分:1)

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

然后您需要group by package.packageid,以便sum操作仅适用于属于某个transactions的{​​{1}}条记录。

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

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。这将确保结果集中包含数量但没有交易的包。

我会建议你阅读并分享。使用sql时它们是必不可少的。从本质上讲,group by会根据他们共同的标准将您的数据拆分成组。然后根据小组的质量筛选出某些结果。