2017-04-26 105 views
0

我有兩個數據庫表:SQL SUM和比較

***aff_purchases*** 

id | affiliate_id | payout 
1 | 12   | 50.00 
2 | 12   | 10.00 
3 | 12   | 50.00 
4 | 12   | 10.00 

***aff_payments*** 

id | affiliate_id | amount_paid 
8 | 12   | 50.00 

我想返回所有的會員的ID在「支出」一共是50或大於「amount_paid」一個會員ID更多的數組。

我認爲我需要彙總列然後比較,但我很努力去理解如何。請參閱我的努力之下:

SELECT 
    (SELECT SUM(amount_paid) FROM exp_cdwd_aff_payments AS pay WHERE pay.affiliate_id = 12) AS 'amount_paid' 
    (SELECT SUM(payout) FROM exp_cdwd_aff_purchases AS pur WHERE pur.affiliate_id = 12) AS 'payout' 
FROM 
    exp_cdwd_aff_payments AS pay 
WHERE 
    payout > amount_paid 
+0

你想要返回什麼? –

回答

1

這裏的一種方法是使用聯接兩個單獨的子查詢來查找支付和支付總額。然後,比較每個affiliate_id看看是否符合你的要求。

SELECT 
    t1.affiliate_id 
FROM 
(
    SELECT affiliate_id, SUM(amount_paid) AS amount_paid_total 
    FROM aff_payments 
    GROUP BY affiliate_id 
) t1 
LEFT JOIN 
(
    SELECT affiliate_id, SUM(payout) AS payout_total 
    FROM aff_purchases 
    GROUP BY affiliate_id 
) t2 
    ON t1.affiliate_id = t2.affiliate_id 
WHERE COALESCE(t2.payout_total, 0) > t1.amount_paid_total + 50 

請注意,有支付但尚未支付的關聯公司不會出現在結果集中。

+0

謝謝蒂姆。 關於你的評論,你的意思是,如果一個會員有一個'金額支付'的總數,但沒有'支付'總數的結果將被忽略? – ccdavies

+0

不,我是說如果會員_only_出現在付費表中,但不是支付表,那麼他不會出現在結果集中。如果您提供有關您的數據的更多信息,我可以調整我的查詢。 –

+0

這就是好蒂姆。我只想返回「支出」總額爲50以上的聯盟ID,因此如果總共沒有「支出」,則無論如何都需要忽略它們。 – ccdavies

0

的問題是,你不能使用在WHERESELECT定義的別名。在大多數數據庫中,您將使用CTE或子查詢。但是,MySQL不支持CTE,它會在子查詢上施加開銷(通過實現它們)。

因此,MySQL已經超載了HAVING子句,以允許它在非聚合查詢中使用。你可以做你想要使用的是什麼HAVING:以上

SELECT a.affiliate_id, 
     (SELECT SUM(cap.amount_paid) FROM exp_cdwd_aff_payments cap WHERE cap.affiliate_id = a.affiliate_id) AS amount_paid 
     (SELECT SUM(pur.payout) FROM exp_cdwd_aff_purchases pur WHERE pur.affiliate_id = a.affiliate_id) AS payout 
FROM affiliates a 
HAVING payout > amount_paid; 

假設你有一個表,每個affiliate_id一行。它通過一個相關的子查詢來使用它。還要注意使用表別名和限定列名。

+0

我沒有看到在任何地方定義/提及的「affiliates」表。 –

+0

@TimBiegeleisen。 。 。應該有一個名爲'affiliate_id'的列。 –