选择总和和内部联接

Kla*_*aus 10 sql join

我有两张桌子

  • 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
Run Code Online (Sandbox Code Playgroud)

意味着来自表的某些行Bills,添加一个列paid,其中包含相关事务量的总和.

但是,它仅在每个账单至少有一笔交易时才有效.否则,不返回无交易账单的行.

也许,那是因为我应该做一个内部联接!

所以我尝试以下方法:

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
Run Code Online (Sandbox Code Playgroud)

但是,这会为所有行返回相同的pay值!我究竟做错了什么 ?

Guf*_*ffa 17

使用左连接而不是子查询:

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
Run Code Online (Sandbox Code Playgroud)

编辑:
要将事务总和与金额进行比较,请处理没有事务时获得的空值:

having isnull(sum(t.amount), 0) < b.amount
Run Code Online (Sandbox Code Playgroud)