我有两张桌子
只要获得“package
”,就会在“transactions
”表格中输入一个条目以及获得的数量。可以执行多个“transactions
”,当完全获取包时,该包的所有事务的总和应该等于包表中该包的数量。
我想写一个SQL语句来检查是否还没有完全获得特定的packageid,即:
我怎样才能做到这一点?我尝试使用的每个联接仅适用于2号但不考虑没有交易的包
我试过了:
select package.packageid, package.quantity, sum(transactions.quantity) from package join transactions on package.packageid = transactions.packageid where package.quantity > sum(transactions.quantity)
也尝试了左连接,但它不起作用。理想情况下,我希望结果中左表中列出的所有包在必要的右侧具有空值
答案 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会根据他们共同的标准将您的数据拆分成组。然后根据小组的质量筛选出某些结果。