Объединить столбцы из таблиц в единую таблицу - PullRequest
0 голосов
/ 09 июля 2020

У меня есть четыре таблицы с данными. Я хочу поместить соответствующие итоговые столбцы из каждой в отдельный столбец. Однако я хотел бы соответствовать dealerId. Таким образом, если в Таблице 1 и Таблице 3 есть одинаковые идентификаторы дилера, они должны быть одной строкой.

Таблица 1

dealerId | t1 Total Amount
---------+---------------
1        |  123
2        |  456

Таблица 2

dealerId | t2 Total Amount
---------+----------------
3        | 111
4        | 222
5        | 333

Таблица 3

dealerId | t3 Total Amount
---------+----------------
1        | 555
3        | 565
6        | 888

Таблица 4

dealerId | t4 Total Amount
---------+----------------
1        | 88
2        | 99
3        | 11

Желаемый результат

dealerId | t1Total Amount | t2Total Amount | t3 Total Amount | t4 Total Amount
---------+----------------+----------------+-----------------+-----------------
1        | 123            |  null          | 555             | 88
2        | 456            |  null          | null            | 99
3        | null           |  111           | 565             | 11
4        | null           |  222           | null            | null
5        | null           |  333           | null            | null
6        | null           |  null          | 888             | null

Я в основном создал представления (я не знаю, является ли это правильный термин для этого) и попытался ОБЪЕДИНЯТЬ ВСЕ их, но это дает мне только один столбец со всеми итогами.

SELECT *
FROM
(
SELECT o.DealerId, Sum(oi.Amount) as T1_Total
FROM ....
) AS T1
UNION ALL
SELECT *
FROM
(
SELECT o.DealerId, Sum(oi.Amount) as T2_Total
FROM ....
) AS T2
UNION ALL
...
-- repeat for T3 and T4

Ответы [ 3 ]

2 голосов
/ 09 июля 2020

Вы также можете использовать оператор pivot:

select dealerId, T1, T2, T3, T4
from (
    select dealerId, 'T1' as Src, "t1 Total Amount" as Amt from T1
    union all
    select dealerId, 'T2'       , "t2 Total Amount"        from T2
    union all
    select dealerId, 'T3'       , "t3 Total Amount"        from T3
    union all
    select dealerId, 'T4'       , "t4 Total Amount"        from T4
     ) vert
pivot (sum(Amt) for Src in (T1,T2,T3,T4)) horiz

Результаты:

   dealerId          T1          T2          T3          T4
----------- ----------- ----------- ----------- -----------
          1         123        NULL         555          88
          2         456        NULL        NULL          99
          3        NULL         111         565          11
          4        NULL         222        NULL        NULL
          5        NULL         333        NULL        NULL
          6        NULL        NULL         888        NULL
2 голосов
/ 09 июля 2020

Попробуйте сделать что-то вроде этого:

  with all_dealer_ids AS (
    SELECT DISTINCT dealerId
    FROM Table1 
    UNION 
    SELECT DISTINCT dealerId
    FROM Table2
    UNION
    SELECT DISTINCT dealerId
    FROM Table3
    UNION
    SELECT DISTINCT dealerId
    FROM Table4 
  )

  SELECT adi.dealerId, SUM(t1.TotalAmount) As T1TotalAmount, SUM(t2.TotalAmount) As 
    T2TotalAmount, SUM(t3.TotalAmount) AS T3TotalAmount, SUM(t4.TotalAmount) AS T4TotalAmount
  FROM all_dealer_ids adi
  LEFT JOIN Table1 t1
    ON adi.dealerId = t1.dealerId
  LEFT JOIN Table2 t2
    ON adi.dealerId = t2.dealerId
  LEFT JOIN Table3 t3
    ON adi.dealerId = t3.dealerId
  LEFT JOIN Table4 t4
    ON adi.dealerId = t4.dealerId
  GROUP BY adi.dealerId
  ORDER BY adi.dealerId ASC
0 голосов
/ 09 июля 2020

Вы захотите использовать JOIN вместо UNION для достижения sh того, что вы ищете. UNION обычно используются для объединения данных, поэтому вы видите все свои данные в одном столбце. Вы можете попробовать что-то подобное, чтобы выполнить sh то, что вы ищете.

SELECT COALESCE(t1_totals.dealerID, t2_totals.dealerID, t3_totals.dealerID, t4_totals.dealerID) AS dealerId
     , t1_totals.t1_total_amount
     , t2_totals.t2_total_amount
     , t3_totals.t3_total_amount
     , t4_totals.t4_total_amount
    FROM (
       SELECT dealerID, sum(amount) AS t1_total_amount FROM t1 GROUP BY t1.dealerID
     ) AS t1_totals
    FULL JOIN (
       SELECT dealerID, sum(amount) AS t2_total_amount FROM t2 GROUP BY t2.dealerID
     ) AS t2_totals
         ON t2_totals.dealerID = t1_totals.dealerID
    FULL JOIN (
       SELECT dealerID, sum(amount) AS t3_total_amount FROM t3 GROUP BY t3.dealerID
     ) AS t3_totals
         ON t3_totals.dealerID = t1_totals.dealerID
    FULL JOIN (
       SELECT dealerID, sum(amount) AS t4_total_amount FROM t4 GROUP BY t4.dealerID
     ) AS t4_totals
         ON t4_totals.dealerID = t1_totals.dealerID
ORDER BY dealerId

введите описание изображения здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...