2017-02-11 133 views
1

我有三个表:复杂的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)已经支付超过一次。

反过来,CreditSum2015-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

代码显然是MySQL,所以我删除了SQL Server的标签。 –

+0

Alexey,请确认您的RDMS,它是您原本在标签中使用的MySQL或SQL Server。 – andrews

+0

我不明白这一点。您显示了两个不同发件人的付款记录。您只需要发送多次付款的发件人。对于所有发件人都是如此,所以我期望得到一个空的结果,但结果显示两行。那么你只需要在2015-03-10之后首次付款的发件人。这仅适用于发件人2.为什么发件人1在您的结果中呢?然后对于发件人2,您有付款= 6000,贷记= 3000。您如何获得4500的结果CreditSum? –

回答

0

如果您只想在'2015-03-10'后发送第一笔付款,那么所有付款都将在该日期之后。

因此,移动日期逻辑在wherehaving条款:

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()是不必要的。

0

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

后-minimal付款日期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 

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