【发布时间】:2019-05-18 11:54:59
【问题描述】:
需要获得付款最少的客户的姓氏和名字。付款有不同的付款方式按付款方式划分的发票付款,因此我需要将具有相同发票编号的付款相加,然后才能确定哪笔付款是最小的付款。付款和客户是由第三个发票链接的不同实体/表格。实体之间的关系是一对多的,如下所示:
Client -----<= Invoice ------<= Payment.
SELECT c.first_name, c.last_name FROM client c, invoice i
wHERE i.id_client_fk1 = c.id_pk
AND i.num_pk = (SELECT num_invoice_fk1
FROM payment
WHERE SUM(amount_after_tax) = (SELECT MIN(SUM(amount_after_tax))
FROM payment
GROUP BY num_pk));
客户在发票中使用的PK 为FK,发票中的PK 在付款中使用为FK。
我想使用与代码中完全相同的逻辑,但显然它必须有效。需要比较WHERE SUM(amount_after_tax) = SELECT MIN(SUM(amount_after_tax))。
我知道这不在SQL 中(因此我的问题的标题),但这是我可以想出的解释它的逻辑。
SELECT c.first_name, c.last_name FROM client c, invoice i
WHERE i.id_client_fk1 = c.id_pk
AND i.num_pk = (SELECT num_invoice_fk1 FROM payment
WHERE amount_after_tax = (SELECT MIN(SUM(amount_after_tax))
FROM payment
GROUP BY num_pk));
此代码在SQL 中运行,但它并没有达到我想要的效果,因为它仅将个人付款与MIN(SUM(amount_after_tax)) 进行比较。假设我一张发票有 3 笔付款。我需要将它们加起来才能与MIN(SUM(amount_after_tax)) 进行比较。也尝试使用 HAVING,但它不起作用。可能是我经验不足。请帮忙
【问题讨论】:
-
MIN(SUM()) 是不允许的。
标签: sql oracle10g aggregate-functions