Показать все значения, которые начинаются с первой буквы каждой строки, разделенной любым разделителем - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть входной столбец name

Ahar
Aris
Suchi
Doll
Dipti

Я хочу, чтобы вывод был с двумя столбцами

FirstLetter TotalsWordsWithThatLetter

A Ahar, Aris
S Suchi
D Doll,Dipti

Я знаю рекурсивный CTE / функция вещи будет полезна. Но не могу написать полный код.

Ответы [ 3 ]

0 голосов
/ 26 февраля 2020
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

Это приведет к желаемому результату.

0 голосов
/ 26 февраля 2020

Ответ на вопрос:

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().

0 голосов
/ 26 февраля 2020

Вот как вы можете это сделать.

Объявите временную таблицу с символом и именем, затем с помощью функции подстроки sql поместите первый символ и имя в таблицу. Оттуда вы можете сгруппировать результаты.

Вот пример для вас для MS sql сервер

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
...