首页 > 解决方案 > 合并双行数据作为输出

问题描述

我有一个带有 Id 和名称的示例表,我想获得一个具有唯一 Id 和组合的一列名称(按 ID 分组)的新表。我的数据如下所示(SQL Server 2017 和 2019 - SSMS):

HouseId,    Names
1,  William
1,  James
1,  Mason
1,  Ella
1,  Jackson
1,  Evelyn
2,  Colton
2,  Robert
3,  Austin
3,  Cooper
3,  Parker
4,  Daisy
5,  Edward
5,  River

我的目标是使用 qry 获得以下输出:

HouseId,    Names
1,  William, James, Mason, Ella, Jackson and Evelyn
2,  Colton and Robert
3,  Austin, Cooper and Parker
4,  Daisy
5,  Edward and River

有没有人有提示/建议如何在不通过 SQL 代码使其复杂化的情况下轻松做到这一点?houseid 的双精度值在 2 到 60 之间。

感谢你们对我的帮助!

标签: sqlsql-server

解决方案


对的渴望and使这变得非常棘手。您似乎关心名称的顺序 - 保留原始表的顺序。为了处理这个问题,我假设有一个排序列:

select houseid,
       (case when count(*) = 1 then max(name)
             else concat(string_agg(case when id <> max_id then name end, ', ') within group (order by id),
                         ' and ',
                         max(case when id = max_id then name end)
                        )
        end) as names
from (select t.*, max(id) over (partition by houseid) as max_id
      from t
     ) t
group by houseid;

如果您没有这样的 id 来保留排序,则可以使用name。结果具有您想要的格式,但如果没有排序列,则无法保留排序。

是一个 db<>fiddle。


推荐阅读