2016-08-05 44 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