SQL多行记录合并为单行:用户多类型邮箱合并实现问询
解决NPI多行邮箱合并为一行的问题
这是典型的行转列需求,有两种简单高效的方法可以实现你的期望输出,我给你一步步说明:
方法一:聚合函数 + CASE表达式
你原来的CASE表达式已经能区分两种邮箱类型,只需要加上GROUP BY NPI和聚合函数(比如MAX)来合并同一NPI的行即可:
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, 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;
原理说明:
GROUP BY NPI将同一NPI的所有记录归为一组MAX()函数会自动忽略NULL值,所以每组里的personal邮箱和work邮箱会被分别提取并合并到同一行
方法二:使用PIVOT运算符
SQL Server的PIVOT专门用于这种行转列的场景,代码更简洁:
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, personal AS personalemail, work AS workemail FROM @t PIVOT ( MAX(email) -- 指定聚合的列 FOR emailtype IN ([personal], [work]) -- 指定要转成列的类型值 ) AS PivotTable;
原理说明:
PIVOT会把emailtype列的不同值(personal和work)直接转成表的列MAX(email)用于在分组后获取对应的邮箱值(因为同一NPI同一类型的邮箱应该只有一个,用MAX/ MIN都可以)
两种方法执行后都会得到你想要的输出:
npi personalemail workemail 1 john@home john@work
内容的提问来源于stack exchange,提问作者jackstraw22
相关产品推荐
相关产品推荐

