Hemil Gandhi Ответов: 3

Параллельный вывод SQL - запроса (объединение трех выходов)


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

SELECT BrCode,Code,sum((ClearBal+AccumuInt+clgamt)) AS BALANCE,sum(OverdueAmt) FROM LON20200331 where AcSts<>9 AND ClearBal<>0 and limit=1 group by BrCode,Code
UNION ALL
SELECT BrCode,Code,sum((ClearBal+AccumuInt+clgamt)) AS BALANCE,sum(OverdueAmt) FROM ADV20200331 where AcSts<>9 AND ClearBal<0 and limit=1 group by BrCode,Code


SELECT BrCode,Code,sum((ClearBal+AccumuInt+clgamt)) AS BALANCE,sum(OverdueAmt) FROM LON20200331 where AcSts<>9 AND ClearBal<>0 and limit=2 group by BrCode,Code
UNION ALL
SELECT BrCode,Code,sum((ClearBal+AccumuInt+clgamt)) AS BALANCE,sum(OverdueAmt) FROM ADV20200331 where AcSts<>9 AND ClearBal<0 and limit=2 group by BrCode,Code


SELECT BrCode,Code,sum((ClearBal+AccumuInt+clgamt)) AS BALANCE,sum(OverdueAmt) FROM LON20200331 where AcSts<>9 AND ClearBal<>0 and limit=3 group by BrCode,Code
UNION ALL
SELECT BrCode,Code,sum((ClearBal+AccumuInt+clgamt)) AS BALANCE,sum(OverdueAmt) FROM ADV20200331 where AcSts<>9 AND ClearBal<0 and limit=3 group by BrCode,Code


Вывод должен быть таким.

           |    Limit=1   |    Limit=2   |   Limit=3    |
Brcode,Code|Balace|Overdue|Balace|Overdue|Balace|Overdue|


Что я уже пробовал:

сводный запрос может быть использован полностью, но я не знаю, как его использовать.

3 Ответов

Рейтинг:
22

OriginalGriff

Просто используйте соединение для выбора строк с соответствующими значениями Brcode и кода из трех операций SELECT: SQL-соединения[^]

Что-то вроде:

SELECT a.Brcode, a.Code, a.Balance, a.Overdue, b.Balace, b.Overdue, c.Balace, c.Overdue
FROM (SELECT ...) a
JOIN (SELECT ...) b ON a.Brcode = b.Brcode AND a.Code = b.Code
JOIN (SELECT ...) C ON a.Brcode = c.Brcode AND a.Code = c.Code;


Maciej Los

+5!

Рейтинг:
19

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 будет переключен на aLEFT 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-сервера Майкрософт документы[^]


Maciej Los

+5!

Рейтинг:
11

Maciej Los

Попробовать это:

SELECT BrCode, Code, Balance1 = SUM(CASE WHEN [limit]=1 THEN BALANCE ELSE 0 END),
    Overdue1 = SUM(CASE WHEN [limit]=1 THEN Overdue ELSE 0 END),
    Balance2 = SUM(CASE WHEN [limit]=2 THEN BALANCE ELSE 0 END),
    Overdue2 = SUM(CASE WHEN [limit]=2 THEN BALANCE ELSE 0 END),
    Balance3 = SUM(CASE WHEN [limit]=3 THEN BALANCE ELSE 0 END),
    Overdue3 = SUM(CASE WHEN [limit]=3 THEN Overdue ELSE 0 END)
FROM
(
    SELECT BrCode, Code, SUM((ClearBal+AccumuInt+clgamt)) AS BALANCE,sum(OverdueAmt) Overdue, [limit]
    FROM LON20200331 
    WHERE AcSts<>9
    GROUP BY BrCode, Code, [limit]
    UNION ALL
    SELECT BrCode, Code, SUM((ClearBal+AccumuInt+clgamt)) AS BALANCE,sum(OverdueAmt) Overdue, [limit]
    FROM ADV20200331
    WHERE AcSts<>9
    GROUP BY BrCode, Code, [limit]
) T
GROUP BY BrCode, Code


или вот это:

SELECT BrCode, Code, pvt1.[1] AS Balance1, pvt2.[1] AS Overdue1,
    pvt1.[2] AS Balance2, pvt2.[2] AS Overdue2,
    pvt1.[3] AS Balance3, pvt2.[3] AS Overdue3 
FROM
(
    SELECT BrCode, Code, [1], [2], [3]
    FROM
    (
        SELECT BrCode, Code, [limit], SUM((ClearBal+AccumuInt+clgamt)) AS BALANCE
        FROM LON20200331  AS LON INNER JOIN ADV20200331 AS ADV ON LON.BrCode = ADV.BrCode AND LON.Code = ADV.Code
        WHERE AcSts<>9
        GROUP BY BrCode, Code, [limit]
    ) dt1
    PIVOT(SUM(BALANCE) FOR [limit] IN([1], [2], [3])) pt1
) pvt1 INNER JOIN 
(
    SELECT BrCode, Code, [1], [2], [3]
    FROM
    (
        SELECT BrCode, Code, [limit], SUM(OverdueAmt) AS Overdue
        FROM LON20200331  AS LON INNER JOIN ADV20200331 AS ADV ON LON.BrCode = ADV.BrCode AND LON.Code = ADV.Code
        WHERE AcSts<>9
        GROUP BY BrCode, Code, [limit]
    ) dt2
    PIVOT(SUM(Overdue) FOR [limit] IN([1], [2], [3])) pt2
) AS pvt2 ON pvt1.BarCode = pvt2.BarCode AND pvt1.Code = pvt2.Code


MadMyche

+5 Переходим к следующему шагу.... У меня кончилось время :)

Maciej Los

Спасибо.

Hemil Gandhi

Спасибо, что ваш запрос действительно сработал.

Maciej Los

Всегда пожалуйста.
Я бы предложил принять все ценные ответы (используйте зеленую кнопку).