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

Mysql 具有多个条件的复杂SQL查询,mysql,sql,Mysql,Sql,我有三张桌子: Sender | SenderKey | SenderGUID | |-----------|------------| | 1 | 100 | | 2 | 101 | Payment | SenderKey | PaymentGUID | Date | Amount | |-----------|-------------|--------

我有三张桌子:

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中使用循环


谢谢。

如果您只希望发送“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()进行比较。

如果您只希望在“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()
进行比较。

子查询满足条件的返回发件人键:

-2015年3月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

测试代码:

子查询返回满足条件的发送者密钥:

-2015年3月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

测试代码:

代码显然是MySQL,因此我删除了SQL Server的ish标记。Alexey,请确认您的RDM,您最初在标记中使用的是MySQL还是SQL Server。我似乎一点都不懂。您正在显示不同发件人的两个付款记录。您只需要已支付多笔款项的发件人。没有一个发送者是这样的,因此我希望结果为空,但您的结果显示两行。那么您只需要在2015年3月10日之后首次付款的发件人。这仅适用于发件人2。为什么发件人1出现在您的结果中?那么对于发件人2,您的付款=6000,信用=3000。那么你如何得到4500的结果呢?代码显然是MySQL,所以我删除了SQL Server的ish标记。Alexey,请确认你的RDM,是MySQL还是SQL Server,你最初在标记中使用的。我似乎一点都不懂。您正在显示不同发件人的两个付款记录。您只需要已支付多笔款项的发件人。没有一个发送者是这样的,因此我希望结果为空,但您的结果显示两行。那么您只需要在2015年3月10日之后首次付款的发件人。这仅适用于发件人2。为什么发件人1出现在您的结果中?那么对于发件人2,您的付款=6000,信用=3000。那么,你如何得出4500英镑的结果呢?