sql-server - SQL 将多条记录合并为一行

标签 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');

这是我到目前为止编写的查询,它把它放在 2 个单独的行上:
    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

我怎样才能做到这一点?

最佳答案

这已经在这里被询问和回答了大约一百万次。它称为条件聚合或交叉表。写答案比找到答案要快。作为替代方案,您可以使用 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

关于sql-server - SQL 将多条记录合并为一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48426598/

相关文章:

mysql - 三元表达式验证 WHERE 子句 T-Sql 中的类型字段

sql - 事务 SQL : Only most recent changes if 2 columns value are the same

c++ - 在 MSSQL 查询中使用 C++ 变量

sql - 如果另一个字段值是特定字符串,则选择

sql - 如何在sql表中找到图像的大小?

sql-server - 在 Management Studio 中使用 Python 自动化 "Generate Scripts"选项从本地 SQL Server 获取数据并将其保存在 .sql 文件中

sql-server - 基于时间列表中的序列岛交叉制表行

sql - 从重复值中获取最新值

sql - 将 SQL 查询结果导出到 CSV

SQL 仅选择缺失和更新的行