-1

我有输入栏name

Ahar
Aris
Suchi
Doll
Dipti

我希望输出包含两列

FirstLetter TotalsWordsWithThatLetter

A Ahar, Aris
S Suchi
D Doll,Dipti

我知道递归 CTE/stuff 函数会有所帮助。但无法编写完整的代码。

4

3 回答 3

0

这就是你可以做到的。

用 char 和 name 声明一个临时表,然后使用 sql 的 substring 函数将第一个字符和 name 放入表中。从那里您可以对结果进行分组。

这是您的 mssql 服务器示例

declare @tbl table(ch char(1), name nvarchar(50))

insert into @tbl
select ( SELECT SUBSTRING(e.address, 1, 1)),address from Emp2 e

select ch,name From @tbl
group by ch, name

select distinct t.[ch],
  STUFF((SELECT distinct ', ' + t1.name
         from @tbl t1
         where t.[ch] = t1.[ch]
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,2,'') department
from @tbl t
于 2020-02-26T09:19:39.510 回答
0
declare @temp table(Name varchar(100))
insert into @temp 
values
('Ahar'), ('Aris'),('Suchi'),('Doll'),('Dipti')

select distinct substring(Name,1,1) FirstLetter,
  STUFF((SELECT distinct ', ' + t1.name
         from @temp t1
         where substring(t.Name,1,1) = substring(t1.Name,1,1)
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,2,'') Name
from @temp t

这将导致预期的结果。

于 2020-02-26T09:43:37.303 回答
0

问题的答案是:

select left(name, 1) as chr, count(*) as cnt,
       string_agg(name, ', ') within group (order by name) as names
from t
group by left(name, 1);

不需要递归子查询或临时表——在面试环境中,我只是假设这个人并不真正了解 SQL。

在旧版本的 SQL Server 中,您需要使用 XML 或其他方法将字符串组合在一起。也就是说,我希望有人在接受采访时知道string_agg()

于 2020-02-26T12:49:03.560 回答