13

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

  • Bills:id amount reference

  • Transactions:id reference amount

次の SQL クエリ

SELECT 
   *,
   (SELECT SUM(amount) 
    FROM transactions 
    WHERE transactions.reference = bils.reference) AS paid
FROM bills
GROUP BY id HAVING paid<amount

table のいくつかの行を対象とし、関連するトランザクションの合計額をBills含む列を追加しました。paid

ただし、各請求書に対して少なくとも 1 つのトランザクションがある場合にのみ機能します。それ以外の場合、トランザクションのない請求書の行は返されません。

おそらく、それは内部結合を行うべきだったからです!

だから私は次のことを試します:

SELECT 
   *,
   (SELECT SUM(transactions.amount) 
    FROM transactions 
    INNER JOIN bills ON transactions.reference = bills.reference) AS paid
FROM bills
GROUP BY id 
HAVING paid < amount

ただし、これはすべての行に対して同じ値の支払済みを返します! 私は何を間違っていますか?

4

3 に答える 3

22

サブクエリの代わりに左結合を使用します。

select b.id, b.amount, b.paid, sum(t.amount) as transactionamount
from bills b
left join transactions t on t.reference = b.reference
group by b.id, b.amount, b.paid
having b.paid < b.amount

編集:
トランザクションの合計を金額と比較するには、トランザクションがないときに取得するnull値を処理します。

having isnull(sum(t.amount), 0) < b.amount
于 2013-02-23T12:23:45.807 に答える
2

RIGHT JOINすべての請求行を含めるにはが必要です。

編集 したがって、最終的なクエリは次のようになります

SELECT 
   *,
   (SELECT SUM(transactions.amount) 
    FROM transactions 
    WHERE transactions.reference = bills.reference) AS paid
FROM bills
WHERE paid < amount
于 2013-02-23T12:16:24.223 に答える
0

このスレッドが古いことは知っていますが、同じ問題が発生したため、今日ここに来ました。

同じ質問の別の投稿を参照してください: 左結合 SQL の合計

答えが示すように、左側のテーブルで GROUP BY を使用します。このようにして、左側のテーブルからすべてのレコードを取得し、右側のテーブルから対応する行を合計します。

これを使用してみてください:

SELECT
   *,
  SUM(transactions.sum)
FROM
   bills
RIGHT JOIN
   transactions
ON
   bills.reference = transactions.reference
WHERE
   transactions.sum > 0
GROUP BY
   bills.id
于 2016-07-08T08:29:10.710 に答える