小编典典

SQL Server组Concat具有不同的字符

sql

我已经研究了许多在SQL Server中模拟“ Group concat”功能的解决方案。我想做一个更具可读性的解决方案,但我不知道该怎么做。

我有一个观点:

ParentID | ChildName

其中包含记录,例如:

1 | Max
1 | Jessie
2 | Steven
2 | Lucy
2 | Jake
3 | Mark

我想将“群组Concat”获得以下这些信息:

1 | Max and Jessie
2 | Steven, Lucy and Jake
3 | Mark

因此,如果只有一个孩子,则返回名称;如果有多个孩子,则将最后两个孩子与“和”联系起来,将所有其他孩子与“,”联系起来。

我对不使用CLR而不愿意这样做的方法有些困惑。我对功能很满意-但是速度是一个问题,如何确定子代号,以便可以在’和’,’,’或’之间进行选择?


阅读 175

收藏
2021-03-23

共1个答案

小编典典

制作更具人性化的解决方案

抱歉,这是我能根据您的要求做的最好的事情。

SQL小提琴

MS SQL Server 2008架构设置

create table YourTable
(
  ParentID int,
  ChildName varchar(10)
);

insert into YourTable values
(1, 'Max'),
(1, 'Jessie'),
(2, 'Steven'),
(2, 'Lucy'),
(2, 'Jake'),
(3, 'Mark');

查询1

with T as 
(
  select ParentID,
         ChildName,
         row_number() over(partition by ParentID order by ChildName) as rn,
         count(*) over(partition by ParentID) as cc
  from YourTable
)
select T1.ParentID,
       (
         select case
                  when T2.rn = 1 and T2.cc > 1 then ' and '
                  else ', ' 
                end + T2.ChildName
         from T as T2
         where T1.ParentID = T2.ParentID
         order by T2.rn desc
         for xml path(''), type
       ).value('substring(text()[1], 3)', 'varchar(max)') as ChildNames
from T as T1
group by T1.ParentID

结果

| PARENTID |            CHILDNAMES |
------------------------------------
|        1 |        Max and Jessie |
|        2 | Steven, Lucy and Jake |
|        3 |                  Mark |
2021-03-23