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