2011-09-15 5 views
0

Je voudrais retourner une liste des employés, diverses informations à leur sujet et une colonne avec la liste des 3 premiers projets auxquels ils ont des heures assignées chaque mois dans une virgule séparée liste. J'ai une instruction select qui retourne les heures avec succès, mais je ne suis pas sûr de savoir comment l'intégrer dans un statemnet select. Voici l'instruction select. J'essaye de faire ceci dans SQL Server.Liste séparée par des virgules dans un SQL SELECT Résultats

 DECLARE @Projects varchar(max) 
    SELECT Top(3) @Projects = COALESCE(@Projects+', ' ,'') + ltrim(rtrim(Projects.Title)) 
       FROM   EmployeeProjectPlanning INNER JOIN 
        Projects ON EmployeeProjectPlanning.ProjectID = Projects.ProjectID 
       WHERE  (EmployeeProjectPlanning.EmpID = 1) AND (EmployeeProjectPlanning.MonthID = 9) AND (EmployeeProjectPlanning.Year = 2011) 
       ORDER BY EmployeeProjectPlanning.Hours DESC 
    SELECT @Projects 
+3

S'il vous plaît, s'il vous plaît, s'il vous plaît nous dire quel produit SQL que vous utilisez. MySQL et SQLite le feraient avec GROUP_CONCAT, dans SQL Server, vous devez écrire une procédure stockée scalaire pour le faire. –

+0

à en juger par la syntaxe, c'est MS SQL. Aussi, je trouve utile de faire une fonction CLR agrégée à cet effet, pour imiter le group_concat de MySQL, si les droits d'accès le permettent. – AlexanderMP

Répondre

2

En supposant que vous utilisez SQL 2005 ou plus, vous pouvez utiliser FOR XML pour créer la liste séparée par des virgules dans un champ. Il suffit de mettre ce qui suit dans votre déclaration SELECT où vous avez besoin de la colonne de projets:

SUBSTRING(
    (SELECT TOP (3) ','+ltrim(rtrim(Projects.Title)) 
    FROM EmployeeProjectPlanning AS emp 
    INNER JOIN Projects as proj ON emp.ProjectID = proj.ProjectID 
    WHERE (emp.EmpID = 1) 
     AND (emp.MonthID = 9) 
     AND (emp.Year = 2011) 
    ORDER BY emp.Hours DESC 
    FOR XML PATH('') 
),2,8000) AS Projects 
Questions connexes