Получить счетчик каждого идентификатора в SQL Server - PullRequest
0 голосов
/ 19 октября 2018

У меня есть следующие таблицы

dbo.employee

id          name      position_id      phone
-----------------------------------------------   
1           Gosho         1            5623565
2           Pesho         2            095656
3           Misho         3            0984654

dbo.repairs

id          service_id  client_id   employee_id    dt      price
----------- ----------- ----------- ----------- ---------- ------
3           1           2           1           2003-05-03 4.54
4           2           1           2           2013-05-03 3.55
5           1           2           1           2003-05-03 4.54
6           2           1           2           2013-05-03 3.55
7           1           2           1           2003-05-03 4.54
8           2           1           2           2013-05-03 3.55
9           1           2           1           2003-05-03 4.54
10          2           1           2           2013-05-03 3.55

Я хочу просмотреть количество ремонтов для каждого сотрудника.

Результат, к которому я стремлюсь, должен быть примерно таким:

employee_id  repairs_count
--------------------------
1             4
2             4

Вот мой код, который я придумал

SELECT 
    COUNT(r.employee_id)
FROM
    repairs r
LEFT JOIN 
    repairs e ON r.id = e.id
WHERE 
    r.id = e.id

Заранее спасибо!

Ответы [ 4 ]

0 голосов
/ 19 октября 2018

Существует несколько способов решить эту группу

с помощью

select e.id,
       e.name,
       e.position_id,
       e.phone,
       count(*) as repairs_count
from   employee e
  left outer join repairs r on e.id = r.employeeid
group by e.id, e.name, e.position_id, e.phone

ПРИМЕЧАНИЕ. Если вы хотите исключить сотрудников, не имеющих ремонта, просто замените левое соединение внутренним объединением

или по подзапросу

select e.id,
       e.name,
       e.position_id,
       e.phone,
       (select count(1) from repairs r where r.employeeid = e.id) as repairs_count
from   employee e

Я бы выбрал первый вариант, так как оптимизатору будет проще использовать индексы, и будет проще исключать сотрудников, не имеющих ремонта, если вы захотите, чтобы

0 голосов
/ 19 октября 2018

с помощью JOIN для добавления дополнительной информации из таблицы сотрудников

SELECT 
   employee_id = e.id,
   e.name, 
   repairs_count = COUNT(r.id)
FROM
   dbo.employee e
   LEFT JOIN
   dbo.repairs r ON e.id = r.employee_id
GROUP BY
   e.id, e.name
HAVING
   COUNT(r.id) > 0
0 голосов
/ 19 октября 2018

Если вы заботитесь только о работниках, у которых есть ремонт - как в ваших результатах выборки - тогда вам не нужно join:

select r.employee_id, count(*) as cnt
from dbo.repairs r
group by r.employee_id;

Если вы хотите все сотрудники, даже те, кто не ремонтируется, затем используют left join:

select e.id, count(r.employee_id) as cnt
from dbo.employees e left join
     dbo.repairs r
     on e.employee_id = r.employee_id
group by e.id;
0 голосов
/ 19 октября 2018

Группировка по employee_id.Агрегатные функции, такие как count(), применяются к каждой группе

select employee_id, count(*) as repairs_count
from repairs
group by employee_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...