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英镑的结果呢?