2016-08-05 43 views
1

我有一个接触表,其中contact_type_id指:
1-电子邮件
2 - 电话
3 - Skype的选择行的数据作为列

下面的例子显示3个不同的用户提供不同类型的触头。

第一个用户有电话号码和Skype。第二个只有电子邮件。第三种有三种类型:电子邮件,电话号码& 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的,那么谷歌Dynamic Pivot - 这里有很多例子。

这是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 Server和MySQL上。注意值应该在sql server中转义。

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