Как объединить несколько строк из одной таблицы с одной строки из другой с каждой строкой отдельный столбец? - PullRequest
0 голосов
/ 14 января 2019

Мне нужно объединить несколько строк из одной таблицы с другой таблицей в одну строку в результате. Мои таблицы оформлены так:

или аналогичный.

Есть идеи? Существует ограниченное количество (<10) доступных тегов. </p>

Любые стандартные объединения, которые я пробовал, давали бы мне несколько строк с одним и тем же customer_id

Таблица 1:

CUSTOMER_ID |  FIRSTNAME |  LASTNAME
1 |  ALICE |  MILLER
2 |  BOB |  SMITH

Таблица 2:

ID  |   CUSTOMER_ID |   TAG
1 |  1 |  PRO-CUSTOMER
2 |  1 |  ADMIN
3 |  2 |  PRO CUSTOMER
...

И мне нужен результат / просмотр как

ID |  FIRSTNAME |  LASTNAME |  TAG |  TAG
1 |  ALICE |  MILLER |  PRO CUSTOMER |  ADMIN
2 |  BOB |  SMITH |  PRO CUSTOMER | 

или аналогичный ...

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Используйте аналитическую функцию ROW_NUMBER(), чтобы присвоить каждому тегу в table2 инкрементный уникальный номер для каждого клиента, а затем PIVOT вывод из строк в столбцы, а затем соединить его с table1:

Установка Oracle :

CREATE TABLE table1 ( CUSTOMER_ID, FIRSTNAME, LASTNAME ) AS
  SELECT 1, 'ALICE', 'MILLER' FROM DUAL UNION ALL
  SELECT 2, 'BOB',   'SMITH' FROM DUAL;

CREATE TABLE table2 ( ID, CUSTOMER_ID, TAG ) AS 
  SELECT 1, 1, 'PRO-CUSTOMER' FROM DUAL UNION ALL
  SELECT 2, 1, 'ADMIN' FROM DUAL UNION ALL
  SELECT 3, 2, 'PRO CUSTOMER' FROM DUAL;

Запрос

SELECT t1.customer_id,
       t1.firstname,
       t1.lastname,
       t2.tag1,
       t2.tag2,
       t2.tag3,
       t2.tag4  -- increase until you reach your maximum number of tags.
FROM   table1 t1
       LEFT OUTER JOIN
       (
         SELECT *
         FROM   ( SELECT customer_id, tag,
                         ROW_NUMBER() OVER ( PARTITION BY customer_id ORDER BY tag, id ) AS rn
                  FROM   table2 )
         PIVOT ( MAX( tag ) FOR rn IN (
           1 AS tag1,
           2 AS tag2,
           3 AS tag3,
           4 AS tag4 -- increase until you reach your maximum number of tags.
         )
       ) t2
       ON ( t1.customer_id = t2.customer_id );

выход

CUSTOMER_ID | FIRSTNAME | LASTNAME | TAG1         | TAG2         | TAG3 | TAG4
----------: | :-------- | :------- | :----------- | :----------- | :--- | :---
          1 | ALICE     | MILLER   | ADMIN        | PRO-CUSTOMER | <em>null</em> | <em>null</em>
          2 | BOB       | SMITH    | PRO CUSTOMER | <em>null</em>         | <em>null</em> | <em>null</em>

дБ <> скрипка здесь

0 голосов
/ 14 января 2019

SQL-запрос имеет фиксированный набор столбцов. Вы можете делать то, что хотите, с двумя столбцами тегов:

select t1.customerid, t1.firstname, t1.lastname,
       min(t2.tag) as tag1,
       (case when min(t2.tag) <> max(t2.tag) then max(t2.tag)
        end) as tag2
from table1 t1 left join
     table2 t2
     on t1.customerid = t2.customerid
group by t1.customerid, t1.firstname, t1.lastname;

Если вы просто хотите получить список тегов - независимо от длины (ну, до 4000 символов) - вы можете использовать listagg():

select t1.customerid, t1.firstname, t1.lastname,
       listagg(t2.tag, ',') within group (order by t2.id) as tags
from table1 t1 left join
     table2 t2
     on t1.customerid = t2.customerid
group by t1.customerid, t1.firstname, t1.lastname;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...