-1
votes

Afficher toutes les valeurs commençant par la première lettre de chaque chaîne séparée par n'importe quel délimiteur

J'ai une colonne d'entrée nom code> xxx pré>

Je veux que la sortie soit avec deux colonnes p>

Totaux de firstSwithThatletter P>

A Ahar, Aris
S Suchi
D Doll,Dipti


3 commentaires

"C'était l'une de mes questions d'entrevue sur Mme SQL." avec le plus grand respect, ce n'est pas une interviewée. S'il s'agit d'une question d'entretien, montrez-nous ce que vous avez essayé et expliquez pourquoi cela n'a pas fonctionné.


Comment puis-je demander et répondre aux questions de devoirs?


Il n'y a pas besoin d'une requête récursive. Ceci peut être fait avec un groupe simple par et une agrégation de chaîne ( string_agg () )


3 Réponses :


0
votes

Voici comment vous pouvez le faire.

Déclarez une table TempAre avec char et nom, puis utiliser la fonction de sous-chaîne de SQL mettez le premier caractère et le premier nom dans la table. De là, vous pouvez regrouper les résultats. P>

Voici l'échantillon pour vous pour MSSQL Server P>

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


0 commentaires

0
votes
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
This would lead to desired result.

0 commentaires

0
votes

La réponse à la question est la suivante:

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);


0 commentaires