如何组合或加入查询以获取我需要的项目列表

时间:2013-04-11 23:23:12

标签: mysql sql

我有几张桌子:

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的所有发票,并且该发票的所有付款总和大于发票总额。

我需要快速。

我该怎么做?

3 个答案:

答案 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)

我更改了一些表/字段名称。很抱歉给您带来不便。

http://www.sqlfiddle.com/#!2/7402d/1/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属性的最小运算符由分组运算符强制执行,最小值实际上取自一组相同的值。