具有多个条件的复杂SQL查询

时间:2017-02-11 17:45:13

标签: mysql sql

我有三张桌子:

Sender

    | SenderKey | SenderGUID | 
    |-----------|------------|
    |     1     |     100    |
    |     2     |     101    |


Payment

    | SenderKey | PaymentGUID |    Date    |   Amount   | 
    |-----------|-------------|------------|------------|
    |     1     |     100     | 2015-03-09 |    4500    |
    |     2     |     101     | 2016-07-12 |    6000    |

Credit

    | SenderKey |   Amount   |    Date    | 
    |-----------|------------|------------|
    |     1     |    1000    | 2015-04-11 |
    |     2     |    3000    | 2016-06-03 | 

我需要提交一个SQL查询,它会产生以下结果:

    | SenderGUID |   PaymentCount   |    CreditSum    | 
    |------------|------------------|-----------------|
    |     100    |        1         |       1000      |
    |     101    |        2         |       4500      |

PaymentCount代表发件人的所有付款,并且1)只计算在2015-03-10之后第一次付款的发件人; 2)已经支付了多笔款项。

反过来,CreditSum会计入2015-03-10的赠送金额。

我提交以下查询来计算PaymentCount:

SELECT Payment.SenderKey, COUNT(Payment.PaymentGuid) 
FROM Payment
WHERE (Payment.Date BETWEEN '2015-03-10' and NOW()) GROUP BY Payment.SenderKey
HAVING COUNT(Payment.PaymentGuid) > 1;

但是,我不知道如何解释第一个的条件。似乎必须使用循环来完成,但我不确定如何在SQL中使用它们。

感谢。

2 个答案:

答案 0 :(得分:0)

如果您只希望在“2015-03-10”之后首次付款,则所有付款都将在该日期之后。

因此,将where中的日期逻辑移动到having子句:

SELECT p.SenderKey, COUNT(p.PaymentGuid) 
FROM Payment p
GROUP BY p.SenderKey
HAVING COUNT(Payment.PaymentGuid) > 1 AND
       MIN(p.Date) >= '2015-03-10';

注意:我假设将来不会付款,因此不需要与NOW()进行比较。

答案 1 :(得分:0)

子查询返回满足条件的SenderKeys:

- 2015-03-10之后的最低付款日期

- 至少两笔付款

SELECT
Sender.SenderGUID,
COUNT(Payment.PaymentGuid) 
FROM
Sender
INNER JOIN 
Payment ON Sender.SenderKey = Payment.SenderKey
INNER JOIN
(
    SELECT SenderKey FROM Payment GROUP BY SenderKey
    HAVING MIN(Date) > '2015-03-10' AND COUNT(Payment.PaymentGuid) > 1
) MatchingSender ON MatchingSender.SenderKey = Payment.SenderKey
GROUP BY Sender.SenderGUID

测试代码:http://sqlfiddle.com/#!9/f5bcd9/1/0