Суммирование значений из 2-й таблицы на основе идентификатора 1-й таблицы - PullRequest
2 голосов
/ 14 мая 2009

Я уже делал этот запрос раньше, но по какой-то причине мне всегда приходится выкапывать ответ. Может кто-нибудь объяснить решение для меня, чтобы я мог наконец "получить его"! (Спасибо!)

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

Вопрос: Перечислите всех сотрудников вместе с общим # (количеством) продаж, которые они имеют.

Ответы [ 5 ]

2 голосов
/ 14 мая 2009
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
2 голосов
/ 14 мая 2009

Вы хотите выбрать всех сотрудников и рассчитать их количество продаж для каждого. Поскольку вы хотите, чтобы все сотрудники были в списке, вы должны выбрать из таблицы «Сотрудники» и либо оставить присоединение к таблице продаж, либо выполнить подзапрос к таблице продаж. Это даст вам сотрудников с нулевыми продажами в результатах. В случае объединения вам необходимо сгруппировать по сотруднику и сосчитать записи в таблице продаж. Для подзапроса нет группы по, потому что ваш базовый запрос вернет только 1 строку на сотрудника.

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.
*/

- ИЛИ -

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
*/

Результаты каждого запроса основаны на приведенных ниже примерах ...

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
1 голос
/ 14 мая 2009

Не правда ли, если предположить, что одну продажу может сделать только один сотрудник?


Выберите Employees.username, count (Sales.saleID)
Из оставленных сотрудников присоединиться к продажам на Employees.employeeID = Sales.employeeID
Группировка по Employees.username

1 голос
/ 14 мая 2009

Вы говорите, что хотите указать сумму в заголовке вопроса, а затем говорите, что хотите # (количество) в теле.

Если вы хотите получить сумму, используйте функцию SUM в SQL.

select Employees.EmployeeID, TotalSales = SUM(amount)
from Employees LEFT JOIN Sales ON Employees.EmployeeID = Sales.EmployeeID
0 голосов
/ 14 мая 2009
select emp.username
      ,isnull((select count(*)
                 from sales
                where sales.employeeid = emp.employeeid),0) as [number of sales]
  from employees emp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...