简体   繁体   English

SQL查询使用两个表(SQL Server)重叠总和

[英]SQL Query to overlap the sums using two tables, SQL Server

I'd so appreciate if someone can help with my query. 如果有人可以帮助我进行查询,我将不胜感激。

I have two tables - Payments and Repayments . 我有两个表- PaymentsRepayments

Payments:                              Repayments:    
DATE         SUM      IS_REPAYED       DATE         SUM
01/01/15     20 000    0               05/01/15     5 000
                                       06/01/15     10 000

I need to have a flag that shows if Payment sum is covered by Repayment sums, in this case, if (5 000 + 10 000) covers 20 000 , now it's not. 我需要有一个标志来显示Payment金额是否包含在Repayment金额中,在这种情况下,如果(5 000 + 10 000) covers 20 000 ,那么现在就不行了。

But when new Repayment added, it is: 但是,当添加新的Repayment ,它是:

Payments:                              Repayments:    
DATE         SUM      IS_REPAYED       DATE         SUM
01/01/15     20 000    1               05/01/15     5 000
                                       06/01/15     10 000
                                       07/01/15     5 000

However, there can be a case, when Repayments exceed payment, it means that Payment is repayed and the rest 5 000 (25 000 - 20 000) should be calculated as a Repayment for the next Payment , ie: 然而,可以有一个情况下,当Repayments超过支付,这意味着Payment是repayed,其余5 000 (25 000 - 20 000)应作为计算Repayment Payment ,即:

Payments:                              Repayments:    
DATE         SUM      IS_REPAYED       DATE         SUM
01/01/15     20 000    1               05/01/15     25 000
01/02/15     10 000    0

and when new repayment comes: 当新还款到来时:

Payments:                              Repayments:    
DATE         SUM      IS_REPAYED       DATE         SUM
01/01/15     20 000    1               05/01/15     25 000
01/02/15     10 000    1               05/02/15     5 000  (or more, ex. 6 000) then 1 000 goes to the next Payment

There is also a case when Repayment comes first, then next payment should have a flag: 还有一种情况是先Repayment ,然后下一次付款应带有标记:

Payments:                              Repayments:    
DATE         SUM      IS_REPAYED       DATE         SUM
                                       01/03/15     30 000
05/03/15     30 000     1              

So how can I get this IS_REPAYED flag, when I query the tables at a certain time, using current situation of Payment/Repayment statement? 因此,当我使用“付款/还款对帐单”的当前状况在特定时间查询表时,如何获得此IS_REPAYED标志? I know I can make a logic for the flag in my application, would it be a better solution? 我知道我可以在应用程序中为标记创建逻辑,这将是一个更好的解决方案吗?

To have a view I've shown above, I use FULL OUTER JOIN : 要查看上面显示的视图,请使用FULL OUTER JOIN

SELECT t1.DATE, t1.SUM, NULL AS IS_REPAYED /*?*/, t2.DATE, t2.SUM
FROM 
(   (SELECT t1.*, row_number() OVER (ORDER BY DATE) as seqnum
    FROM Payments t1
    ) t1 
   FULL OUTER JOIN
   (SELECT t2.*, row_number() OVER (ORDER BY DATE) as seqnum
   FROM Repayments t2
   ) t2
ON t1.seqnum = t2.seqnum
)

Hmm I think that you can achieve that with the following sql query 嗯,我认为您可以使用以下sql查询来实现

SELECT t1.DATE, SUM(t1.SUM), SUM(t1.SUM) = SUM(t2.SUM) AS IS_REPAYED, t2.DATE, SUM(t2.SUM)
FROM Payments t1 FULL OUTER JOIN Repayments t2 ON t1.DATE = t2.DATE
GROUP BY t1.DATE

1. Updating IS_REPAYED to 0 or 1 in PAYMENTS table when repaymant amount is less or equal to than payment amount for that month. 1.更新IS_REPAYED为0或1 PAYMENTS表时repaymant量小于或大于该月的支付金额等于。

UPDATE PAYMENTS SET IS_REPAYED = S.IS_REPAYED
FROM
(
    SELECT P.[DATE],CASE WHEN  R.[SUM] = P.[SUM] THEN 1 ELSE 0 END IS_REPAYED
    FROM PAYMENTS P 
    JOIN 
    (
        SELECT CAST(DATEADD(month, DATEDIFF(month, 0, [DATE]), 0)AS DATE) [DATE],  SUM([SUM]) [SUM]
        FROM REPAYMENTS
        GROUP BY CAST(DATEADD(month, DATEDIFF(month, 0, [DATE]), 0)AS DATE)
    )R
    ON DATEPART(MONTH,P.[DATE]) = DATEPART(MONTH,R.[DATE]) AND R.[SUM] <= P.[SUM]
)S
WHERE PAYMENTS.[DATE]=S.[DATE]
  • Click here to view result(repaymant amount is less than payment amount) 点击此处查看结果(还款额少于还款额)
  • Click here to view result(repaymant amount is equal to payment amount) 点击此处查看结果(还款额等于还款额)

2. Updating IS_REPAYED to 0 or 1 in PAYMENTS table and insertion to both tables when repaymant amount is greater than payment amount for that month. 2.在还款额大于该月的付款额时,将PAYMENTS表中的IS_REPAYED更新为0或1,并插入两个表中。

Finds sum and groups to each month data in inner query, then compare it with payment table. 在内部查询中找到每个月数据的总和和组,然后将其与付款表进行比较。 Since we need this data for further insertions to both PAYMENTS and REPAYMENTS table, we use a temporary table. 由于我们需要此数据来进一步插入PAYMENTSREPAYMENTS表,因此我们使用一个临时表。

SELECT P.[DATE] PAYDATE ,P.[SUM] PAYSUM ,R.[DATE] REDATE,R.[SUM] RESUM
INTO #NEWTABLE
FROM PAYMENTS P 
JOIN 
(
    SELECT  CAST(DATEADD(month, DATEDIFF(month, 0, [DATE]), 0)AS DATE) [DATE],  SUM([SUM]) [SUM]
    FROM REPAYMENTS
    GROUP BY  CAST(DATEADD(month, DATEDIFF(month, 0, [DATE]), 0)AS DATE)
)R
ON DATEPART(MONTH,P.[DATE]) = DATEPART(MONTH,R.[DATE]) AND R.[SUM] > P.[SUM]

Now we find the difference and insert to REPAYMENTS table 现在我们找到差异并插入REPAYMENTS

INSERT INTO REPAYMENTS
SELECT DATEADD(DAY,1,PAYDATE) [DATE], (RESUM-PAYSUM) REAMOUNT
FROM #NEWTABLE

Similarly we find the difference and insert to PAYMENTS table 同样,我们找到差异并插入到PAYMENTS表中

INSERT INTO PAYMENTS    
SELECT DATEADD(MONTH,1,PAYDATE) [DATE], (RESUM+(RESUM-PAYSUM))-PAYSUM REAMOUNT,1
FROM #NEWTABLE

Since value in REPAYMENTS table is greater than PAYMENTS table we directly update value of table to 1 from temporary table. 由于REPAYMENTS表中的值大于PAYMENTS表,因此我们将表的值直接从临时表更新为1。

UPDATE PAYMENTS SET ISREPAYED = 1
FROM
(
    SELECT PAYDATE FROM  #NEWTABLE
)N
WHERE PAYMENTS.[DATE]=N.PAYDATE

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM