我有几张桌子:
Invoice
-----------------
ID total
1 500.00
2 100.00
3 10.00
Payment
---------------------------------------
ID invoiceId Amount Method
1 1 400 CASH
2 2 60 CASH
3 2 40 CREDIT
我需要一个查询,其中包含至少一个payment.method为CREDIT的所有发票,并且该发票的所有付款总和大于发票总额。
我需要快速。
我该怎么做?
答案 0 :(得分:1)
SELECT a.ID InvoiceID,
a.Total TotalInvoice,
b.TotalPayment
FROM Invoice a
INNER JOIN
(
SELECT InvoiceID, SUM(Amount) TotalPayment
FROM Payment
GROUP BY InvoiceID
HAVING SUM(Method = 'CREDIT') > 0
) b ON a.ID = b.InvoiceID AND
a.Total < b.TotalPayment
答案 1 :(得分:1)
另一种方法:
SELECT
i.`id`,
i.`total` AS `total_invoiced`,
SUM(p.`amount`) AS `total_payments`,
SUM(IF(p.`method`='credit', 1, 0)) AS `count_credit`
FROM `invoices` i
LEFT JOIN `payments` p ON (p.`invoice_id`=i.`id`)
WHERE 1=1
GROUP BY i.`id`
HAVING (`total_payments` > i.`total`) AND (`count_credit` > 0)
我更改了一些表/字段名称。很抱歉给您带来不便。
答案 2 :(得分:0)
试试这个:
select iagg.ID
from (
select i.ID
, sum (p.amount) tl_paid
, min (i.total) tl
from invoice i
join payment p on ( p.invoiceID = i.ID )
group by i.ID
) iagg
where exists (
select 1
from payment p2
where p2.invoiceId = iagg.ID
and p2.method = 'CREDIT'
)
and iagg.tl_paid > iagg.tl
;
total
属性的最小运算符由分组运算符强制执行,最小值实际上取自一组相同的值。