选择行数据作为列

时间:2016-08-05 05:46:52

标签: mysql sql sql-server

我有一个联系人表,其中contact_type_id表示:  
1-电子邮件
2 - 电话
3 - skype

以下示例显示了具有不同类型联系人的3个不同用户。

第一位用户拥有电话号码和Skype。第二个只有电子邮件。第三种类型有三种类型:电子邮件,电话号码和电话号码。 Skype的。

user_id  contact_type_id  value
1        2                353234
1        3                skypeLogin
2        1                example@mail.com
3        1                example2@mail.com
3        2                123345
3        3                skypeLogin2

需要澄清问题 我如何选择此数据,如下表

user_id     email              phone     skype
1           null               353234    skypeLogin
2           example@mail.com   null      null
3           example2@mail.com  123345    skypeLogin2

4 个答案:

答案 0 :(得分:2)

Pivot是您正在寻找的。如果你有contact_type_id未知数量的谷歌动态数据透视 - 那么就有大量的例子。

这适用于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, 'example@mail.com' ),
        ( 3, 1, 'example2@mail.com' ),
        ( 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           example@mail.com     NULL                 NULL
3           example2@mail.com    123345               skypeLogin2

(3 row(s) affected)

答案 1 :(得分:2)

如果 MySQL 然后使用CASE WHENGROUP 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

答案 2 :(得分: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,                'example@mail.com'),
(3,        1,                'example2@mail.com'),
(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;

答案 3 :(得分:0)

一个是Pivot表,其他可以低于逻辑: 创建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
相关问题