SQL将多个记录合并为一行

时间:2018-01-24 15:57:15

标签: sql-server

我有一张桌子可以提取用户ID以及他们的个人和工作电子邮件。我想每个ID有一行显示两种类型的电子邮件,但我无法弄清楚如何做到这一点。

    declare @t table(NPI int, email varchar(50), emailtype varchar(50))
    insert into @t
    values(1, 'john@home', 'personal'), (1, 'john@work', 'work');

这是我到目前为止所写的查询,它将它放在两个不同的行上:

    select npi, case when emailtype = 'personal' then email end as  personalemail,
    case when emailtype = 'work' then email end as workemail
    from @t;

当前输出:

   npi     personalemail    workemail
    1      john@home          NULL
    1       NULL              john@work

我希望看到的是:

    npi    personalemail         workemail
     1        john@home           john@work

我该怎么做?

2 个答案:

答案 0 :(得分:3)

使用pivot

SELECT
    *
    FROM @T
    PIVOT
    (
        MAX(email)
        FOR EmailType IN
        (
            personal,work
        )
    )Q

答案 1 :(得分:3)

这已被问及在这里回答了大约一百万次。它被称为条件聚合或交叉表。写答案比找一个答案要快。作为替代方案,你可以使用PIVOT,但我发现语法对我来说有点迟钝。

select NPI
    , max(case when emailtype = 'personal' then email end) as PersonalEmail
    , max(case when emailtype = 'work' then email end) as WorkEmail
from @t
group by NPI