Как объединить несколько строк в одну в SQL? - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть конкретная таблица, в которой есть следующие столбцы -

Table

Идентификатор атрибута может иметь 6 возможных значений от 1 до 6.Эта таблица будет содержать записи для всех клиентов.Каждая строка для клиента содержит запись для 1-6 значений.

Теперь я хотел бы достичь следующего:

Desired Output

Я выполняю следующий запрос -

SELECT CUST_ID,
        CASE WHEN "ATTR ID"=1 THEN "ATTR_VALUE" END AS ATTR_ID_1,
        CASE WHEN "ATTR ID"=2 THEN "ATTR_VALUE" END AS ATTR_ID_2,
        CASE WHEN "ATTR ID"=3 THEN "ATTR_VALUE" END AS ATTR_ID_3,
        CASE WHEN "ATTR ID"=4 THEN "ATTR_VALUE" END AS ATTR_ID_4,
        CASE WHEN "ATTR ID"=6 THEN "ATTR_VALUE" END AS ATTR_ID_5,
        CASE WHEN "ATTR ID"=7 THEN "ATTR_VALUE" END AS ATTR_ID_6

FROM "TABLE_NAME" where CUST_ID='20002123'

Это приводит к хорошему получению 6 столбцов, но в итоге создается и 3 строки -

Output

Должен ли я повернуть стол?

Спасибо

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Вы можете агрегировать, используя GROUP BY CUST_ID, чтобы получить несколько строк как одну строку.

Попробуйте изменить запрос следующим образом.

SELECT CUST_ID, 
       Max(ATTR_ID_1) AS ATTR_ID_1, 
       Max(ATTR_ID_2) AS ATTR_ID_2, 
       Max(ATTR_ID_3) AS ATTR_ID_3, 
       Max(ATTR_ID_4) AS ATTR_ID_4, 
       Max(ATTR_ID_5) AS ATTR_ID_5, 
       Max(ATTR_ID_6) AS ATTR_ID_6 
FROM   (SELECT CUST_ID, 
               CASE WHEN "ATTR ID" = 1 THEN "ATTR_VALUE"  END AS ATTR_ID_1, 
               CASE WHEN "ATTR ID" = 2 THEN "ATTR_VALUE"  END AS ATTR_ID_2, 
               CASE WHEN "ATTR ID" = 3 THEN "ATTR_VALUE"  END AS ATTR_ID_3, 
               CASE WHEN "ATTR ID" = 4 THEN "ATTR_VALUE"  END AS ATTR_ID_4, 
               CASE WHEN "ATTR ID" = 6 THEN "ATTR_VALUE"  END AS ATTR_ID_5, 
               CASE WHEN "ATTR ID" = 7 THEN "ATTR_VALUE"  END AS ATTR_ID_6 
        FROM   "TABLE_NAME" 
        WHERE  CUST_ID = '20002123')T 
GROUP  BY CUST_ID 
0 голосов
/ 21 февраля 2019

Вы совсем близко:

SELECT CUST_ID,
    max(CASE WHEN "ATTR ID"=1 THEN "ATTR_VALUE" END) AS ATTR_ID_1,
    max(CASE WHEN "ATTR ID"=2 THEN "ATTR_VALUE" END) AS ATTR_ID_2,
    max(CASE WHEN "ATTR ID"=3 THEN "ATTR_VALUE" END) AS ATTR_ID_3,
    max(CASE WHEN "ATTR ID"=4 THEN "ATTR_VALUE" END) AS ATTR_ID_4,
    max(CASE WHEN "ATTR ID"=6 THEN "ATTR_VALUE" END) AS ATTR_ID_5,
    max(CASE WHEN "ATTR ID"=7 THEN "ATTR_VALUE" END) AS ATTR_ID_6

FROM "TABLE_NAME" where CUST_ID='20002123'
Group by cust_id;

Также вы можете посмотреть на пивот.

...