SQL查询在连接到多个事务表时乘以总和结果

SQL查询在连接到多个事务表时乘以总和结果,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在编制一份报告,根据分配和取消日期衡量现金绩效。为了衡量这一点,我查询了一个transactions子查询,该子查询将收回所有交易,并根据账号和交易的起始日期和截止日期合并。然后在查询的顶部对其进行汇总 当使用一个子查询时,一切都很好,但是我现在必须添加一个额外的事务子查询;1计算从分配日期到取消日期或今天(如果值为空)的实际付款,2计算从分配日期+14天到取消日期或今天(如果值为空)的任何取消付款 第一个子查询工作得很好,但现在我添加了第二个子查询,它将求和值乘以8。我在过去两次尝试查询此

我正在编制一份报告,根据分配和取消日期衡量现金绩效。为了衡量这一点,我查询了一个transactions子查询,该子查询将收回所有交易,并根据账号和交易的起始日期和截止日期合并。然后在查询的顶部对其进行汇总

当使用一个子查询时,一切都很好,但是我现在必须添加一个额外的事务子查询;1计算从分配日期到取消日期或今天(如果值为空)的实际付款,2计算从分配日期+14天到取消日期或今天(如果值为空)的任何取消付款

第一个子查询工作得很好,但现在我添加了第二个子查询,它将求和值乘以8。我在过去两次尝试查询此表时都遇到过这种情况。不总是在8点之前。有什么想法吗

谢谢

总计这些TEST1的总和工作正常,TEST2没有那么多,子查询:

SUM(CASE WHEN v1.[Transaction Date1] >= dateadd(DD, 1, EOMONTH(getdate(), -1)) 
            THEN v1.[Payments] ELSE 0 
    END) AS TEST1,
SUM(CASE WHEN v2.[Transaction Date2] >= dateadd(DD, 1, EOMONTH(getdate(), -1)) 
            THEN v2.[Payments2] ELSE 0 
    END) AS TEST2,
我的代码:

LEFT JOIN 
    (SELECT 
         [Account Number1], [Transaction Date1], SUM([Payments1]) AS [Payments]
     FROM 
         (SELECT
              ACCOUNTNO AS [Account Number1],
              TRANDT AS [Transaction Date1],
              CASE 
                 WHEN TRANSACTIONTYPE = 'Credit' 
                    THEN TRANAMT * -1
                    ELSE TRANAMT
              END [Payments1]
          FROM 
              TRANSACTIONS t WITH (NOLOCK)
          JOIN 
              TRANSACTIONDETAILS td WITH (NOLOCK) ON td.TRANSACTIONID = t.TRANSACTIONS1
          JOIN 
              TRANSACTIONS a WITH (NOLOCK) ON a.ID = TRANSACTIONS1
                                           AND [TRANTYPE] LIKE '%PAY%'
                                           AND [TRANAMT] <> 0
          INNER JOIN 
              ACCOUNTS na WITH (NOLOCK) ON a.ACCOUNTID = ACCOUNTS1
          WHERE 
              TRANSACTIONTYPE = 'Credit') v
     GROUP BY 
         [Account Number1], [Transaction Date1]) v1 ON MAINT.[ACCNO] = v1.[Account Number1]
                                                    AND MAINT.[Allocation Date] <= v1.[Transaction Date1]
                                                    AND v1.[Transaction Date1] <=  MAINT.[Transaction to date]
LEFT JOIN 
    (SELECT 
         [Account Number2], [Transaction Date2], SUM([Payments2]) AS [Payments2]
     FROM 
         (SELECT
              ACCOUNTNO AS [Account Number2],
              TRANDT AS [Transaction Date2],
              CASE  
                 WHEN TRANSACTIONTYPE = 'Credit' 
                    THEN TRANAMT * -1
                    ELSE TRANAMT
              END [Payments2]
          FROM 
              TRANSACTIONS t WITH (NOLOCK)
          INNER JOIN 
              TRANSACTIONDETAILS td WITH (NOLOCK) ON td.TRANSACTIONID = t.TRANSACTIONS1
          INNER JOIN 
              TRANSACTIONS a WITH (NOLOCK) ON a.ID = TRANSACTIONS1
                                           AND [TRANTYPE] LIKE '%PAY%'
                                           AND [TRANAMT] <> 0
          INNER JOIN 
              ACCOUNTS na WITH (NOLOCK) ON a.ACCOUNTID = ACCOUNTS1
          WHERE 
              TRANSACTIONTYPE = 'Debit') v
      GROUP BY 
          [Account Number2], [Transaction Date2]) v2 ON MAINT.[ACCNO] = v2.[Account Number2]
                                                     AND DATEADD(DD,10,MAINT.[DCA Allocation Date]) <= v2.[Transaction Date2]
                                                     AND v2.[Transaction Date2] <=  MAINT.[Transaction to date]

由于两个联接中最内部的subselect是相同的,所以应该将它放在顶部的WITH语句中,然后只使用两次。 像这样:

WITH v_CTE
AS  
(SELECT
              ACCOUNTNO AS [Account Number2],
              TRANDT AS [Transaction Date2],
              CASE  
                 WHEN TRANSACTIONTYPE = 'Credit' 
                    THEN TRANAMT * -1
                    ELSE TRANAMT
              END [Payments2]
          FROM 
              TRANSACTIONS t WITH (NOLOCK)
          INNER JOIN 
              TRANSACTIONDETAILS td WITH (NOLOCK) ON td.TRANSACTIONID = t.TRANSACTIONS1
          INNER JOIN 
              TRANSACTIONS a WITH (NOLOCK) ON a.ID = TRANSACTIONS1
                                           AND [TRANTYPE] LIKE '%PAY%'
                                           AND [TRANAMT] <> 0
          INNER JOIN 
              ACCOUNTS na WITH (NOLOCK) ON a.ACCOUNTID = ACCOUNTS1
          WHERE 
              TRANSACTIONTYPE = 'Debit') 
...
LEFT JOIN 
    (SELECT 
         [Account Number1], [Transaction Date1], SUM([Payments1]) AS [Payments]
     FROM 
         v_CTE v
     GROUP BY 
         [Account Number1], [Transaction Date1]) v1 ON MAINT.[ACCNO] = v1.[Account Number1]
                                                    AND MAINT.[Allocation Date] <= v1.[Transaction Date1]
                                                    AND v1.[Transaction Date1] <=  MAINT.[Transaction to date]
LEFT JOIN 
    (SELECT 
         [Account Number2], [Transaction Date2], SUM([Payments2]) AS [Payments2]
     FROM 
         v_CTE v
      GROUP BY 
          [Account Number2], [Transaction Date2]) v2 ON MAINT.[ACCNO] = v2.[Account Number2]
                                                     AND DATEADD(DD,10,MAINT.[DCA Allocation Date]) <= v2.[Transaction Date2]
                                                     AND v2.[Transaction Date2] <=  MAINT.[Transaction to date]

由于两个联接中最内部的subselect是相同的,所以应该将它放在顶部的WITH语句中,然后只使用两次。 像这样:

WITH v_CTE
AS  
(SELECT
              ACCOUNTNO AS [Account Number2],
              TRANDT AS [Transaction Date2],
              CASE  
                 WHEN TRANSACTIONTYPE = 'Credit' 
                    THEN TRANAMT * -1
                    ELSE TRANAMT
              END [Payments2]
          FROM 
              TRANSACTIONS t WITH (NOLOCK)
          INNER JOIN 
              TRANSACTIONDETAILS td WITH (NOLOCK) ON td.TRANSACTIONID = t.TRANSACTIONS1
          INNER JOIN 
              TRANSACTIONS a WITH (NOLOCK) ON a.ID = TRANSACTIONS1
                                           AND [TRANTYPE] LIKE '%PAY%'
                                           AND [TRANAMT] <> 0
          INNER JOIN 
              ACCOUNTS na WITH (NOLOCK) ON a.ACCOUNTID = ACCOUNTS1
          WHERE 
              TRANSACTIONTYPE = 'Debit') 
...
LEFT JOIN 
    (SELECT 
         [Account Number1], [Transaction Date1], SUM([Payments1]) AS [Payments]
     FROM 
         v_CTE v
     GROUP BY 
         [Account Number1], [Transaction Date1]) v1 ON MAINT.[ACCNO] = v1.[Account Number1]
                                                    AND MAINT.[Allocation Date] <= v1.[Transaction Date1]
                                                    AND v1.[Transaction Date1] <=  MAINT.[Transaction to date]
LEFT JOIN 
    (SELECT 
         [Account Number2], [Transaction Date2], SUM([Payments2]) AS [Payments2]
     FROM 
         v_CTE v
      GROUP BY 
          [Account Number2], [Transaction Date2]) v2 ON MAINT.[ACCNO] = v2.[Account Number2]
                                                     AND DATEADD(DD,10,MAINT.[DCA Allocation Date]) <= v2.[Transaction Date2]
                                                     AND v2.[Transaction Date2] <=  MAINT.[Transaction to date]

你可以做得更好。你不妨给这个可怜的人发一点sql。你可以做得更好。你不妨给这个可怜的人发一点sql。