Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL查询使用两个表重叠总和,SQL Server_C#_Sql_Sql Server_Entity Framework - Fatal编程技术网

C# SQL查询使用两个表重叠总和,SQL Server

C# SQL查询使用两个表重叠总和,SQL Server,c#,sql,sql-server,entity-framework,C#,Sql,Sql Server,Entity Framework,如果有人能帮我提问,我将不胜感激 我有两个表-付款和还款 Payments: Repayments: DATE SUM IS_REPAYED DATE SUM 01/01/15 20 000 0 05/01/15 5 000 06/01/15

如果有人能帮我提问,我将不胜感激

我有两个表-
付款
还款

Payments:                              Repayments:    
DATE         SUM      IS_REPAYED       DATE         SUM
01/01/15     20 000    0               05/01/15     5 000
                                       06/01/15     10 000
我需要有一个标志,显示
付款
金额是否包含在
还款
金额中,在这种情况下,如果
(5000+10000)包含20000
,则现在不是

但当新增还款时,它是:

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
然而,也可能存在这样的情况,当
还款
超过付款时,这意味着
付款
已偿还,其余
5000(25000-20000)
应计算为
还款
,用于下一次
付款
,即:

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
当新的还款到来时:

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
还有一种情况是,
还款
先到,然后下一次付款应该有一个标志:

Payments:                              Repayments:    
DATE         SUM      IS_REPAYED       DATE         SUM
                                       01/03/15     30 000
05/03/15     30 000     1              
那么,当我在某个时间使用付款/还款对账单的当前情况查询表时,如何获取该
IS_returned
标志?我知道我可以在我的应用程序中为标志创建一个逻辑,这是一个更好的解决方案吗

为了获得上面显示的视图,我使用了
完全外部联接

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
)

嗯,我认为您可以通过下面的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。当还款金额小于或等于当月的付款金额时,更新的
将在
付款
表中还款至0或1。

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]
现在我们找到差异并插入到
还款表中

INSERT INTO REPAYMENTS
SELECT DATEADD(DAY,1,PAYDATE) [DATE], (RESUM-PAYSUM) REAMOUNT
FROM #NEWTABLE
INSERT INTO PAYMENTS    
SELECT DATEADD(MONTH,1,PAYDATE) [DATE], (RESUM+(RESUM-PAYSUM))-PAYSUM REAMOUNT,1
FROM #NEWTABLE
类似地,我们找到差异并插入到
付款
表中

INSERT INTO REPAYMENTS
SELECT DATEADD(DAY,1,PAYDATE) [DATE], (RESUM-PAYSUM) REAMOUNT
FROM #NEWTABLE
INSERT INTO PAYMENTS    
SELECT DATEADD(MONTH,1,PAYDATE) [DATE], (RESUM+(RESUM-PAYSUM))-PAYSUM REAMOUNT,1
FROM #NEWTABLE
由于
还款
表中的值大于
付款
表中的值,我们直接将表中的值从临时表更新为1

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]
UPDATE PAYMENTS SET ISREPAYED = 1
FROM
(
    SELECT PAYDATE FROM  #NEWTABLE
)N
WHERE PAYMENTS.[DATE]=N.PAYDATE
  • 查看结果

如果我问的是显而易见的问题,请原谅,但您的意思是想在物理表中添加一个“还款”列,还是只是一个“结果集”列?结果集列最适合,也可以使用“表”类型的变量。请随时询问任何更改:)@Gyuzal r感谢您的耐心和帮助!