2017-08-01 1 views
0

Je voudrais prendre mes données brutes et les regrouper par nom, mais montrer toutes les catégories auxquelles chaque nom est associé. J'espère que l'image simplifie ce que j'essaie de faire. Est ce que quelqu'un sait comment accomplir cela? J'ai envisagé de faire un pivot, puis de combiner des colonnes, mais je me demande s'il existe un moyen plus simple et plus simple. Merci!Comment regrouper et inclure toutes les catégories

enter image description here

Répondre

2

Vous pouvez utiliser le FOR XML PATH pour construire votre chaîne CSV. Le STUFF supprime simplement la virgule principale de la liste.

SELECT Name, Categories = STUFF((
    SELECT ', ' + Category 
     FROM dbo.YourTable 
     WHERE Name = x.Name 
    FOR XML PATH(''), TYPE).value('.[1]', 'nvarchar(max)'), 1, 2, '') 
FROM dbo.YourTable AS x 
GROUP BY Name; 
+0

Je suis va devoir franchir cela avec soin. Je ne suis pas familier avec la fonction Stuff ou le chemin XML. Merci de m'avoir mis sur la bonne voie! – JFrizz

+0

@ Joe Stefanelli, Désolé de poser la question ci-dessous ici. Je n'ai aucune idée de la façon de gérer le scénario. Veuillez jeter un coup d'oeil. https://stackoverflow.com/questions/46285924/which-kind-of-table-design-best-suitable-for-normalization-in-sql-server. Veuillez me suggérer la meilleure solution. – RGS

1

Vous pouvez utiliser des choses et le chemin xml comme ci-dessous:

Select [Name], 
    Categories = stuff((select Concat(',',category) from #rawdata r where r.[Name] = ou.[Name] for xml path('')), 1,1, '') 
from #rawdata ou group by [Name] 

Si vous utilisez SQL Server 2017 ou SQL Azure vous pouvez ensuite utiliser String_Agg comme ci-dessous

Select [Name], String_Agg(category,',') from #rawdata 
    group by [Name] 
+0

Je vais devoir faire attention à cela. Je ne suis pas familier avec la fonction Stuff ou le chemin XML. Merci de m'avoir mis sur la bonne voie! On dirait que vous et Joe ont fourni des réponses très similaires. Je vais les regarder attentivement tous les deux. – JFrizz