MadMyche
Вам не нужно поворачиваться, вам нужно JOIN
[^] таблицы; и я бы также рекомендовал вам использовать CTE
с[^] чтобы сделать его немного чище.
CTE в основном инкапсулирует один из ваших запросов в псевдоним одноразового использования.
Я бы сделал это для каждого из ваших запросов (разное имя для каждого из них)
; WITH cteA AS (
SELECT BrCode, Code, Balance = sum((ClearBal+AccumuInt+clgamt)), Overdue = sum(OverdueAmt)
FROM LON20200331
where AcSts<>9
AND ClearBal<>0
and limit=1
group by BrCode,Code
UNION ALL
SELECT BrCode, Code, Balance = sum((ClearBal+AccumuInt+clgamt)), Overdue = sum(OverdueAmt)
FROM ADV20200331
where AcSts<>9
AND ClearBal<0
and limit=1
group by BrCode,Code
)
Теперь у вас должно быть определено 3 CTE (я назову их cteA, cteB, cteC), вы можете просто соединить их вместе.
SELECT a.Brcode, a.Code
, BalanceL1 = a.Balance, OverdueL1 = a.Overdue
, BalanceL2 = b.Balance, OverdueL2 = b.Overdue
, BalanceL3 = c.Balance, OverdueL3 = c.Overdue
FROM cteA
INNER JOIN cteB as b ON a.Brcode = b.BrCode AND a.Code = b.Code
INNER JOIN cteC as c ON a.Brcode = c.BrCode AND b.Code = c.Code
Если вы все сделали правильно... вы должны получить нулевые результаты. Это потому, что я использовал
INNER JOIN
чтобы связать эти таблицы вместе; для этого потребуется, чтобы все 3 объединенные таблицы имели одинаковые значения [BrCode] и [code].
3 CTE были определены с определенным значением для
Предел так что тот же brcode,кодовая комбинация не будет находиться более чем в 1 таблице.
Решение будет другая, КТР должен быть зарегистрирован в. Это будет сделано только для того, чтобы получить коды, и не будет нуждаться в агрегированных значениях, так что не будет никакой группы по. Мы хотим, чтобы каждая кодовая комбинация была только один раз, так что
UNION
не будет содержать всех.
; WITH cteM as (
SELECT Brcode,Code
FROM LON20200331
WHERE AcSts<>9
AND ClearBal<>0
AND Limit IN (1, 2, 3)
UNION
SELECT BrCode,Code
FROM ADV20200331
WHERE AcSts<>9
AND ClearBal<0
AND Limit IN (1, 2, 3)
)
Метод JOIN будет переключен на a
LEFT OUTER
что потребует только значения в левой половине уравнения. Пропущенные значения справа будут заменены на
НУЛЕВОЙSELECT m.Brcode, m.Code
, BalanceL1 = a.Balance, OverdueL1 = a.Overdue
, BalanceL2 = b.Balance, OverdueL2 = b.Overdue
, BalanceL3 = c.Balance, OverdueL3 = c.Overdue
FROM cteM m
LEFT OUTER JOIN cteA a ON m.Brcode = a.BrCode AND m.Code = a.Code
LEFT OUTER JOIN cteB b ON m.Brcode = b.BrCode AND m.Code = b.Code
LEFT OUTER JOIN cteC c ON m.Brcode = c.BrCode AND m.Code = c.Code
Это должно дать вам несколько результатов. Возможно, вам придется проделать некоторую работу самостоятельно, чтобы получить желаемые результаты. Я вижу в этом потенциальные недостатки, и в настоящее время у меня есть своя собственная работа.
Рекомендации:
Соединения (SQL Server) - SQL Server | Microsoft Docs[
^]
With обобщенное_табличное_выражение (Transact-SQL) при SQL-сервера Майкрософт документы[
^]