我有三张桌子:
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中使用它们。
感谢。
答案 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