Как оптимизировать запрос, используя соединение с подзапросом? - PullRequest
0 голосов
/ 17 июня 2020

Я хочу иметь возможность перечислить сумму изменения баланса, но для другого типа. На выполнение запроса уходит около 7 минут. Я уверен, что есть способ лучше его оптимизировать, но не знаю, как это сделать. Я не могу использовать его в качестве подзапроса, потому что мне нужно вернуть более одного результата.

SELECT DISTINCT a.ACCOUNTNUMBER AS [Account Number]
    , s1.Deposit AS [Aggregate Share Balance]
    , c.Deposit AS [Aggregate Checking Balance]

FROM dbo.ACCOUNT a

JOIN dbo.SAVINGS s
    ON a.ACCOUNTNUMBER = s.PARENTACCOUNT
        AND a.ProcessDate = s.ProcessDate

JOIN (SELECT a.ACCOUNTNUMBER
    , SUM(st.BALANCECHANGE) AS [Deposit]
FROM dbo.ACCOUNT a
JOIN dbo.SAVINGS s
    ON a.ACCOUNTNUMBER = s.PARENTACCOUNT
        AND a.ProcessDate = s.ProcessDate
JOIN dbo.SAVINGSTRANSACTION st
    ON st.PARENTACCOUNT = s.PARENTACCOUNT
WHERE a.ProcessDate = CONVERT(VARCHAR(8), DATEADD(DAY,-1, GETDATE()), 112)
    AND a.CLOSEDATE IS NULL
    AND s.CLOSEDATE IS NULL 
    AND st.ACTIONCODE = 'D'
    AND s.TYPE IN (0, 1, 2, 3, 4, 6, 100)
    GROUP BY a.ACCOUNTNUMBER) s1 ON s1.ACCOUNTNUMBER = a.ACCOUNTNUMBER

LEFT JOIN (SELECT a.ACCOUNTNUMBER
    , SUM(st.BALANCECHANGE) AS [Deposit]
FROM dbo.ACCOUNT a
JOIN dbo.SAVINGS s
    ON a.ACCOUNTNUMBER = s.PARENTACCOUNT
        AND a.ProcessDate = s.ProcessDate
JOIN dbo.SAVINGSTRANSACTION st
    ON st.PARENTACCOUNT = s.PARENTACCOUNT
WHERE a.ProcessDate = CONVERT(VARCHAR(8), DATEADD(DAY,-1, GETDATE()), 112)
    AND a.CLOSEDATE IS NULL
    AND s.CLOSEDATE IS NULL 
    AND st.ACTIONCODE = 'D'
    AND s.TYPE IN (2, 100, 101, 102, 103, 104, 105, 106, 107, 108, 113, 150, 201)
    GROUP BY a.ACCOUNTNUMBER) c ON c.ACCOUNTNUMBER = a.ACCOUNTNUMBER

WHERE a.ProcessDate = CONVERT(VARCHAR(8), dateadd(day,-1, getdate()), 112)
    AND a.CLOSEDATE IS NULL
    AND s.CLOSEDATE IS NULL 
ORDER BY a.ACCOUNTNUMBER

Текущие результаты:

Account Number  Aggregate Share Balance   Aggregate Checking Balance
0000001234           7383.58                      NULL
0000001235           95856.83                   95856.83
0000001236            123.27                     123.27
0000001237             1.88                       NULL
0000001238           14812.26                     NULL
0000001239            15.00                       NULL
0000001240            4.06                        NULL
0000001241            6.42                        3.21
0000001242           3705.03                    3705.03
0000001243          976841.06                  1465261.59

1 Ответ

1 голос
/ 17 июня 2020

Я не думаю, что вам нужно запрашивать баланс два раза. Единственное различие между двумя подзапросами - TYPE. Вы можете попробовать что-то подобное ниже и запросить только один раз. Я также думаю, что DISTINCT не нужен, поскольку вы можете сгруппировать свой основной запрос по номеру учетной записи, если удалите подзапросы.

SELECT a.ACCOUNTNUMBER AS [Account Number],
    SUM(CASE WHEN s.TYPE IN (0, 1, 2, 3, 4, 6, 100) THEN st.BALANCECHANGE ELSE NULL END) AS [Aggregate Share Balance],
    SUM(CASE WHEN s.TYPE IN (2, 100, 101, 102, 103, 104, 105, 106, 107, 108, 113, 150, 201) THEN st.BALANCECHANGE ELSE NULL END) AS [Aggregate Share Balance]
FROM dbo.ACCOUNT a
JOIN dbo.SAVINGS s ON a.ACCOUNTNUMBER = s.PARENTACCOUNT AND a.ProcessDate = s.ProcessDate
LEFT OUTER JOIN dbo.SAVINGSTRANSACTION st ON st.PARENTACCOUNT = s.PARENTACCOUNT
WHERE
    a.ProcessDate = CONVERT(VARCHAR(8), dateadd(day,-1, getdate()), 112)
    AND a.CLOSEDATE IS NULL
    AND s.CLOSEDATE IS NULL
GROUP BY
    a.ACCOUNTNUMBER
ORDER BY 
    a.ACCOUNTNUMBER  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...