2009-05-14 8 views
2

J'ai déjà fait cette requête, mais pour une raison quelconque, je dois toujours chercher la réponse. Quelqu'un peut-il m'expliquer la solution pour que je puisse enfin l'avoir? (merci!)Résumant les valeurs de la 2ème table en fonction de l'ID de la première table

Table#1 Employees (employeeID, username) 
Table#2 Sales (saleID, employeeID, amount) 

Question: Énumérer tous les employés, ainsi que le nombre total de ventes qu'ils ont.

Répondre

2

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

est la deuxième partie du groupe par (Employees.UserName) nécessaire? –

+0

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. –

+0

s'il vous plaît expliquer le downvote - deux de mes requêtes sont corrects. –

0
select emp.username 
     ,isnull((select count(*) 
       from sales 
       where sales.employeeid = emp.employeeid),0) as [number of sales] 
    from employees emp 
1

Vous dites que vous voulez que la somme le titre de la question, mais dites que vous voulez le # (compte) dans le corps.

Si vous voulez la somme, utilisez la fonction SUM dans SQL.

select Employees.EmployeeID, TotalSales = SUM(amount) 
from Employees LEFT JOIN Sales ON Employees.EmployeeID = Sales.EmployeeID 
2
select 
    e.employeeID 
    , e.username 
    , count(s.saleID) as'sales count' 
    , sum(s.amount) as 'sales $ total' 
from 
    employees e 
left outer join 
    sales s 
on 
    s.employeeID = e.employeeID 
group by 
    e.employeeID 
    , e.username 
+0

votre requête comme indiqué dans la réponse donnera l'erreur suivante ... Msg 8120, niveau 16, état 1, ligne 1 La colonne 'e.employeeID' n'est pas valide dans la liste de sélection car elle n'est pas contenue dans un fonction d'agrégat ou la clause GROUP BY. –

+0

J'ai ajouté une clause group by à la requête, cela devrait faire l'affaire. – RSolberg

+2

Cette liste ne répertorie pas tous les employés - même si elle est corrigée pour supprimer les deux opérations MAX inutiles (et liste le nom et l'ID dans la clause GROUP BY); il ne répertorie que les employés qui ont fait au moins une vente. L'INNER JOIN doit être une jointure gauche. –

1

est-il pas ce simple, en supposant que l'on vente ne peut être faite par un employé?


Sélectionnez Employees.username, count (Sales.saleID)
De gauche employés Rejoindre des ventes sur Employees.EmployeeID = Sales.employeeID
Groupe par Employees.username

+0

"en supposant qu'une vente ne peut être faite par un employé" - bon point. Pourquoi, alors, pensez-vous qu'il est prudent de supposer que le nom d'utilisateur est unique? – onedaywhen

Questions connexes