SQL - 使用附加条件过滤查询结果

SQL - Filter a query result with an additional condition

我有一个包含两个 table 的数据库: - 记录我必须收到的所有付款的信用 - 记录我收到的付款的付款

结构是 信用:id,总计 付款:id,已收到

我的目标是进行查询,打印所有尚未全额支付的付款。现在我写了一个成功打印的查询 - 信用证号 - 总金额要求 - 收到的总金额 我只需要添加一个条件:付款完全完成的记录不要打印。这是我的 SQL 代码:

SELECT Credit.id,
       Credit.total,
       (SELECT SUM(Payment.received)
       FROM Payment WHERE Payment.id = Credit.id) AS TotalReceived
FROM Credit
WHERE Credit.total > 0;

我尝试用 "WHERE Credit.total > TotalReceived" 更改最后一行,但它不起作用。

你能帮帮我吗? :)

PS。在 Credit 中,id 是唯一的,而在 Payment table 中可以出现许多具有相同 id 的行。

除非使用子查询,否则不能为聚合列添加 WHERE 子句。您必须使用 GROUP BYHAVING

的组合

您的查询可以这样重写(我更喜欢这种使用 JOIN 的结构,而不是像您使用的那样使用相关查询。

SELECT Credit.id, Sum (Credit.total), SUM(Payment.received) TotalReceived
FROM Credit
INNER JOIN Payment ON Payment.id = Credit.id
WHERE Credit.total > 0
GROUP BY Credit.id

现在,添加一个 HAVING 子句

SELECT Credit.id, Sum (Credit.total), SUM(Payment.received) TotalReceived
FROM Credit
INNER JOIN Payment ON Payment.id = Credit.id
WHERE Credit.total > 0
GROUP BY Credit.id
HAVING SUM(Payment.received) > 0

如果你绝对想保留你的结构,使用这样的子查询

Select Id, Total, TotalReceived
From
(
    SELECT Credit.id, Credit.total, (SELECT SUM(Payment.received)
    FROM Payment WHERE Payment.id = Credit.id) AS TotalReceived
    FROM Credit
    WHERE Credit.total > 0
) DerivedTable
Where TotalReceived > 0

这应该可以让你得到未支付的信用记录。你的付款 table 可能应该有一个 creditId 字段加入而不是 Credit.id = Payment.id 但如果这是设置的方式,这应该可以工作。

SELECT  c.id,
        c.total,
        SUM(Nz(p.received,0)) AS totalreceived
FROM    Credit c
        LEFT JOIN Payment p ON c.id = p.id --not sure about this?
WHERE   c.total > 0
GROUP BY c.id, c.total
HAVING  c.total > SUM(Nz(p.received,0))