2016-08-09 36 views
2

Ich weiß nicht, wie die Anzahl der Personen in der Einreichung zählen und ihre Liste ausgeben.Wie die Anzahl der Personen in der Einreichung zu zählen SQL Server

Employees.ReportsTo zeigt ID an, an wen sich diese Person richtet.

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 

Das in der Ausgabe ist:

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 

Beispieldaten von Mitarbeiter

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 
+1

Bitte geben Sie Details, was Ihre Abfrage ausgibt und was ist Ihr erwartetes Ergebnis – TheGameiswar

+0

Bitte bearbeiten Sie Ihre Frage, um die relevanten Tabellen DDL und einige Beispieldaten als DML enthalten. –

Antwort

0

Das Hauptproblem ist, die Sie vergleichen Felder:

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 

Hier, das sein muss nur in der gleichen Reihe. Weil Employees keinen Alias ​​hat, kann der SQL Server nicht die Emploees.ReportsTo in der inneren Auswahl mit der Employees.EmployeeID in der Hauptauswahl vergleichen - es sieht alles gleich aus. Versuchen Sie ändern Untergebene zu:

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, '') 

Auch nicht eine CASE für die COUNT für einen similare Grund verwenden. Verwenden Sie eine andere innere wählen:

-- 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, 

Das sollte Ihr Problem lösen. Bedenken Sie, dass es nicht das schnellste ist. Wenn Sie Geschwindigkeit wünschen, schauen Sie in CROSS APPLY

+0

Vielen Dank !!! –