[英]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
. 我有两个表-
Payments
和Repayments
。
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]
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. 由于我们需要此数据来进一步插入
PAYMENTS
和REPAYMENTS
表,因此我们使用一个临时表。
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.