簡體   English   中英

將一個表中一個字段的值與另一表中多個字段的總和進行比較

[英]Comparing the value of a field in one table to the sum of multiple fields in another table

我有兩張桌子

  • 包裹表:包裹編號,數量
  • 交易表: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)

也嘗試了左聯接,但沒有用。 理想情況下,我希望結果中從左側表中列出的所有軟件包在必要時在右側具有空值

如果要包括沒有事務的軟件包,則需要保留external join 這將所有包保留在結果中,並匹配存在事務的事務。

然后,您需要 package.packageid進行分組,以便您的sum運算僅適用於屬於某個packageid transactions記錄。

然后,您可以使用Have子句 ,該子句與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 這將確保結果集中包含一定數量但沒有交易的包裹。

我建議您仔細閱讀分組依據。 在使用sql時,它們是必不可少的。 從本質上講,分組依據可根據它們共有的條件將數據分為幾組。 然后根據小組的素質篩選出某些結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM