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 BY
和 HAVING
的组合
您的查询可以这样重写(我更喜欢这种使用 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))
我有一个包含两个 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 BY
和 HAVING
您的查询可以这样重写(我更喜欢这种使用 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))