2017-04-26 168 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'的列。 –