Vous voudriez sélectionner tous les employés et calculer leur nombre de ventes pour chacun. Étant donné que vous souhaitez que tous les employés de la liste soient sélectionnés, sélectionnez-les dans la table Employés et quittez la jointure vers la table des ventes ou effectuez une sous-requête dans la table des ventes. Cela vous donnera aussi les employés avec zéro ventes dans les résultats. Dans le cas de la jointure, vous devez regrouper par l'employé et compter les enregistrements dans la table des ventes. Pour la sous-requête, il n'y a pas de groupe parce que votre requête de base retournera seulement 1 ligne par employé.
select Employees.EmployeeID,
Employees.UserName,
CountOfSales = COUNT(SaleID)
from Employees LEFT JOIN
Sales ON Employees.EmployeeID = Sales.EmployeeID
group by Employees.EmployeeID,
Employees.UserName
/*
EmployeeID UserName CountOfSales
----------- ---------- ------------
2 bill 1
3 larry 0
1 scott 2
Warning: Null value is eliminated by an aggregate or other SET operation.
*/
- OU -
select E.*,
CountOfSales = (select count(*)
from sales
where EmployeeID = E.EmployeeID)
from Employees E
/*
employeeID username CountOfSales
----------- ---------- ------------
1 scott 2
2 bill 1
3 larry 0
*/
Les résultats de chaque requête sont basés sur les données d'échantillon ci-dessous ...
create table Employees (employeeID int , username varchar(10))
create table Sales (saleID int , employeeID int , amount smallmoney)
go
insert Employees values (1, 'steve'), (2, 'bill'), (3, 'larry')
insert Sales values (1, 1, 23), (2,1,33), (3,2,0)
go
est la deuxième partie du groupe par (Employees.UserName) nécessaire? –
si vous le voulez dans les résultats, oui. Vous ne pouvez pas avoir de valeur non agrégée dans la clause select sans la placer dans la clause group by. –
s'il vous plaît expliquer le downvote - deux de mes requêtes sont corrects. –