1

私は2つのテーブルを持っています

  • パッケージ表: packageid、数量
  • トランザクション テーブル: transactionid、packageid、数量

「 」が取得されるたびに、取得された数量とともにpackage「 」テーブルにエントリが作成されます。transactions複数の ' transactions' を実行でき、パッケージが完全に取得されると、そのパッケージのすべてのトランザクションの合計は、パッケージ テーブル内のそのパッケージの数量と等しくなります。

特定の packageid が完全に取得されていないかどうかを確認する SQL ステートメントを書きたいと思います。

  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)

左結合も試しましたが、うまくいきません。理想的には、必要に応じて右側に null 値を付けて、結果の左側の表からリストされたすべてのパッケージが必要です

4

1 に答える 1

1

トランザクションを持たないパッケージを含めたい場合は、left outer joinが必要です。これにより、すべてのパッケージが結果に保持され、トランザクションが存在する場合にトランザクションが一致します。

次に、操作が特定の に属するレコードに対してのみ機能するように、グループ化 する必要があります。package.packageidsumtransactionspackageid

次に、 where 句に似たhaving 句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
;

合体は、「null 以外の最初の値を取る」と言っているだけです。したがって、sum(t.quantity)返された場合は代わりnullに使用されます。0これにより、数量のあるパッケージが確認されますが、トランザクションは結果セットに含まれません。

group by と having を読むことをお勧めします。これらは、SQL を使用する場合に不可欠です。基本的に、group by は、共通の基準に基づいてデータをグループに分割します。次に、グループの性質に基づいて特定の結果を除外します。

于 2012-06-04T03:33:03.137 に答える