Mysql создать новый столбец путем слияния нескольких столбцов и результат diplay - PullRequest
0 голосов
/ 21 мая 2019

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

Например, data_1:

user_id | family | friend | roommate | college
===============================================
1002345 |    1   |    0   |     1    |    0
-----------------------------------------------
1002346 |    0   |    1   |     0    |    1
-----------------------------------------------
  ...   |   ...  |   ...  |   ...    |   ...
------------------------------------------------

Я пробовал использовать функцию «Case When» или «Unpivot» в Mysql, но они не работают.

select 
  user_id, 
  category 
from data_1 
unpivot (category for col_name in (
               data_1.family,
               data_1.friend,
               data_1.roommate,
               data_1.college)
          )

Таблица ожидаемых результатов:

user_id | Category | Value
============================
1002345 | Family   |    1   
----------------------------
1002345 | Friend   |    0
----------------------------
1002345 | Roommate |    1
----------------------------
1002345 | College  |    0
----------------------------    
1002346 | Family   |    0   
----------------------------
1002346 | Friend   |    1
----------------------------
1002346 | Roommate |    0
----------------------------
1002346 | College  |    1
---------------------------- 
  ...   |   ...    |   ... 
----------------------------

Спасибо!

1 Ответ

0 голосов
/ 21 мая 2019

Мы можем использовать оператор UNION ALL set для объединения результатов нескольких запросов.

Мы могли бы выполнить операцию JOIN, чтобы получить четыре строки из каждой строки в таблице. Как то так:

SELECT t.user_id 
     , q.category       AS `Category`
     , CASE q.category 
       WHEN 'Family'    THEN t.family 
       WHEN 'Friend'    THEN t.friend
       WHEN 'Roommate'  THEN t.roommate
       WHEN 'College'   THEN t.college
       END AS `Value` 
  FROM data_1 t
 CROSS
  JOIN ( SELECT 'Family'  AS category
         UNION ALL SELECT 'Friend'
         UNION ALL SELECT 'Roommate'
         UNION ALL SELECT 'College'
       ) q
 ORDER
    BY t.user_id 
     , q.category='College'
     , q.category

Или мы могли бы сделать что-то вроде этого:

( SELECT t1.user_id
       , 'Family'       AS `Category`
       , t1.family      AS `Value`
    FROM data_1 t1
)
UNION ALL
( SELECT t2.user_id
       , 'Friend'
       , t2.friend
    FROM data_1 t2
)
UNION ALL
( SELECT t3.user_id
       , 'Roommate'
       , t3.roommate
    FROM data_1 t3
)
UNION ALL
( SELECT t4.user_id
       , 'College'
       , t4.college
    FROM data_1 t4
)
ORDER BY user_id, `Category`='College',`Category`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...