2013-04-11 47 views
0

我有幾個表:怎麼辦我組或一起加入查詢來獲取項目的列表,我需要

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

我寫了一個Java程序要做到這一點,但我需要它作爲一個單一的查詢,我不知道如何獲得付款的總和及仍然能夠告訴我們,如果有至少一個付款是CREDIT – kasdega

回答

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 
+0

我認爲這讓我相當困擾...現在測試 – kasdega

+0

也許你的意思是總支付是大於或等於總髮票的例子http://www.sqlfiddle.com/#!2/cf7af/ 4 –

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屬性的最小操作者通過操作者分組規定,最小實際上是從一組相同的值而採取的。

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) 

我改變了一些表/字段名。抱歉給你帶來不便。

http://www.sqlfiddle.com/#!2/7402d/1/0

相關問題