2016-08-05 2 views
1

У меня есть таблица, где контакты contact_type_id означает:
1- Отправить по электронной почте
2 - телефонный
3 - скайпВыбор данных строк, как колонки

Приведенный ниже пример показывает 3 различных пользователей с различными типами контактов.

У первого пользователя есть номер телефона и Skype. Второй - только электронная почта. Третий имеет все 3 типа: электронная почта, номер телефона & Skype.

user_id contact_type_id value 
1  2    353234 
1  3    skypeLogin 
2  1    [email protected] 
3  1    [email protected] 
3  2    123345 
3  3    skypeLogin2 

Вопрос необходимо уточнить Как выбрать эти данные в следующей таблице

user_id  email    phone  skype 
1   null    353234 skypeLogin 
2   [email protected] null  null 
3   [email protected] 123345 skypeLogin2 
+1

'' MySQL' или SQL-SERVER'? – 1000111

ответ

2

Pivot является то, что вы ищете. Если у вас есть неизвестное число contact_type_id, тогда google Dynamic Pivot - есть много примеров на SO.

Это для SQL Server:

CREATE TABLE #Contacts 
     (
     user_id INTEGER 
     ,contact_type_id INTEGER 
     ,value NVARCHAR(20) 
     ); 

INSERT INTO #Contacts 
     (user_id, contact_type_id, value) 
    VALUES 
     (1, 2, '353234'), 
     (1, 3, 'skypeLogin'), 
     (2, 1, '[email protected]'), 
     (3, 1, '[email protected]'), 
     (3, 2, '123345'), 
     (3, 3, 'skypeLogin2'); 


SELECT 
     pvt.user_id 
     ,pvt.[1] email 
     ,pvt.[2] phone 
     ,pvt.[3] skype 
    FROM 
     #Contacts 
    PIVOT(MAX(value) FOR contact_type_id IN ([1], [2], [3])) pvt; 



user_id  email    phone    skype 
----------- -------------------- -------------------- -------------------- 
1   NULL     353234    skypeLogin 
2   [email protected]  NULL     NULL 
3   [email protected] 123345    skypeLogin2 

(3 row(s) affected) 
+0

Это именно то, что мне нужно. Спасибо! –

2

Если MySQL затем использовать CASE WHEN вместе с GROUP BY

SELECT 
user_id, 
MAX(CASE WHEN contact_type_id = 1 THEN `value` END) AS email, 
MAX(CASE WHEN contact_type_id = 2 THEN `value` END) AS phone, 
MAX(CASE WHEN contact_type_id = 3 THEN `value` END) AS skype 
FROM your_table 
GROUP BY user_id 

WORKING DEMO

1

Это работает на сервере SQL и MySQL. Значение примечания должно быть экранировано на сервере sql.

USE sandbox; 
/* 
create table users(user_id int,contact_type_id int, value varchar(20)); 
insert into users values 
(1,  2,    '353234'), 
(1,  3,    'skypeLogin'), 
(2,  1,    '[email protected]'), 
(3,  1,    '[email protected]'), 
(3,  2,    '123345'), 
(3,  3,    'skypeLogin2'); 
*/ 

select user_id, 
      max(case when contact_type_id = 1 then value else '' end) as email, 
      max(case when contact_type_id = 2 then value else '' end) as tel, 
      max(case when contact_type_id = 3 then value else '' end) as skpe 
from users 
group by user_id; 
0

Один Сводная таблица, другой может быть ниже логики: создать 3 таблицы: 1. С user_id и предназначенный только по электронной почте, т.е. где contact_type_id = 1 2. user_id и значение для только телефона, т.е. где contact_type_id = 2 3. С user_id и значением только для skype, т. е. где contact_type_id = 3 4. Внешнее соединение трех таблиц.

Ниже код делает то же самое:

Select A.user_id,A.value as email, B.value as Phone, C.Value as Skype 
from contacts A 

outer join contacts B 
On A.User_id=B.User_ID and A.value=1 and B.value=2 

outer join contacts C 
On A.User_id=C.User_ID and C.Value=3 
Смежные вопросы