Comment countr le nombre de personnes dans la soumission SQL Server

Je ne sais pas comment countr le nombre de personnes dans la soumission et produire leur list.

Employees.ReportsTo indique id, celui à qui cette personne soumet.

Select Employees.LastName, Employees.FirstName, Region.RegionDescription, count(case when Employees.ReportsTo=Employees.EmployeeID then 1 end) as Count_of_employees, Subordinates = STUFF((SELECT ', ' + Employees.LastName FROM Employees WHERE Employees.ReportsTo = Employees.EmployeeID FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') from Employees left join EmployeeTerritories on Employees.EmployeeID=EmployeeTerritories.EmployeeID left join Territories on EmployeeTerritories.TerritoryID=Territories.TerritoryID left join Region on Territories.RegionID=Region.RegionID group by Region.RegionDescription, Employees.LastName, Employees.FirstName 

C'est en sortie:

 Last name First Name RegionDescription Count_of_employees Subordinates Davolio Nancy Eastern 0 NULL Fuller Andrew Eastern 0 NULL Peacock Margaret Eastern 0 NULL Buchanan Steven Eastern 0 NULL 

Ici, cela doit être:

 Last name First Name RegionDescription Count_of_employees Subordinates Davolio Nancy Eastern 0 NULL Fuller Andrew Eastern 3 Davolio,Peacock, Buchanan Peacock Margaret Eastern 0 NULL Buchanan Steven Eastern 0 NULL 

Exemples de données provenant des employés

 FirstName LastName EmployeeID ReportsTo Nancy Davolio 1 2 Andrew Fuller 2 NULL Janet Leverling 3 2 Margaret Peacock 4 2 Steven Buchanan 5 2 Michael Suyama 6 5 Robert King 7 5 Laura Callahan 8 2 Anne Dodsworth 9 5 

Le problème principal est que vous comparez des champs uniquement sur la même ligne. Parce que les Employees n'ont pas d'alias, le server SQL ne sait pas comparer les Emploees.ReportsTo dans la sélection interne à Employees.EmployeeID dans la sélection principale – tout est identique. Essayez de modifier Subordonnés à:

 Subordinates = STUFF((SELECT ', ' + Employees.LastName FROM Employees ESubordinate -- so SQL knows it's a "different" table WHERE ESubordinate.ReportsTo = Employees.EmployeeID FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 

De même, n'utilisez pas CASE pour COUNT pour une raison similaire. Utilisez un autre select interne:

  -- the () are important here, and ECount differentiates the two Employees tables too (SELECT COUNT(1) FROM Employees ECount WHERE ECount.ReportsTo = Employees.ReportsTo) as Count_of_employees, 

Ceci devrait régler votre problème. Gardez à l'esprit que ce n'est pas le plus rapide. Si vous voulez de la vitesse, regardez dans CROSS APPLY