Combiner plusieurs champs dans un champ de texte dans SQL Server
-
09-09-2019 - |
Question
J'ai une table qui ressemble à ceci:
Name ID TaskID HoursAssigned ---------------------------------------------------------------- John Smith 4592 A01 40 Matthew Jones 2863 A01 20 Jake Adams 1182 A01 100 Matthew Jones 2863 A02 50 Jake Adams 2863 A02 10
et je veux retourner un ensemble de données qui ressemble à ceci:
TaskID PeopleAssigned ------------------------------------------------------------ A01 Jake Adams, John Smith, Matthew Jones A02 Matthew Jones, Jake Adams
Le problème est ici que je n'aurais aucune idée combien de personnes sont affectées à une tâche donnée. Toute suggestion serait génial!
La solution
Cette question est posée tous les jours ici. Voici d'hier. Et un autre
https://stackoverflow.com/questions/tagged/sql+string-concatenation
Autres conseils
ESSAYER:
declare @table table (name varchar(30), ID int, TaskID char(3), HoursAssigned int)
insert into @table values ('John Smith' ,4592 ,'A01' ,40)
insert into @table values ('Matthew Jones',2863 ,'A01' ,20)
insert into @table values ('Jake Adams' ,1182 ,'A01' ,100)
insert into @table values ('Matthew Jones',2863 ,'A02' ,50)
insert into @table values ('Jake Adams' ,2863 ,'A02' ,10)
--formatted so you can see what is happening
SELECT DISTINCT
t1.TaskID
,SUBSTRING(
replace(
replace(
(SELECT
t2.Name
FROM @Table AS t2
WHERE t1.TaskID=t2.TaskID
ORDER BY t2.Name
FOR XML PATH(''))
,'</NAME>','')
,'<NAME>',', ')
,3,2000) AS PeopleAssigned
FROM @table AS t1
EN FONCTION DE RÉPONSE D'HIER!
Voici la sortie:
(1 row(s) affected)
(1 row(s) affected)
(1 row(s) affected)
(1 row(s) affected)
(1 row(s) affected)
TaskID PeopleAssigned
------ --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
A01 Jake Adams, John Smith, Matthew Jones
A02 Jake Adams, Matthew Jones
(2 row(s) affected)
BTW, il est une mauvaise idée de stocker les noms dans un champ. Il est très difficile à interroger. Comment le premier caractère que vous voulez rechercher efficacement « Smith » withouth utilisant des caractères génériques qui empêche la base de données à l'aide des indices. Et si les noms sont stockés freeform comme celui-ci, une personne peut-être « John Smith », « Smith, John », « Smith, John » « Smith, John » etc et vous ne réaliserait pas qu'ils étaient la même personne. Vous devez à un minumum ont prenom, middle_name, last_name, personal_Suffix et vous pouvez éventuellement avoir un champ calulated qui indique le nom complet dans le format que vous souhaitez afficher.
Je suis nouveau à sql, et de nouveau à stackoverflow, mais ne serait pas ce travail?
SELECT taskid, nom FROM table GROUP BY taskid