ВЫБЕРИ сотрудников с количеством выполненных задач

Как бы сделать следующее в SQL:

msgstr "выбрать все emps со списком пометить все задачи".................................

EmpId  EmpName
------ --------
1        tom
2        jerry
3        jack


taskId EmpID    mark
------ -----   ------
1       1        5
2       3        0
3       1        10
4       2        5
5       2        10
6       3        5
7       3        5

Результат:

EmpName  0       5       10    sum
------ -----   ------  ------  ----
tom      0       1        1     2
jerry    0       1        1     2
jack     1       2        0     3

3 ответа

Решение

Попробуй это:

SELECT e.EmpId, e.EmpName, 
       SUM(CASE WHEN t.mark = 0 THEN 1 ELSE 0 END) AS 0Mark, 
       SUM(CASE WHEN t.mark = 5 THEN 1 ELSE 0 END) AS 5Mark, 
       SUM(CASE WHEN t.mark = 10 THEN 1 ELSE 0 END) AS 10Mark, 
       COUNT(1) AS TotalMark
FROM employee e 
INNER JOIN task t ON e.EmpId = t.EmpId 
GROUP BY e.EmpId, e.EmpName;

Это зависит от вашего движка базы данных - Google "Pivot SQL " + ваш движок базы данных (например, "Pivot SQL MySQL").

Функция поворота означает, что вы можете преобразовать значения в столбце "mark" в заголовки столбцов, поэтому, если у вас есть отметки в диапазоне от 0 до 100, вы получите один столбец для каждого значения без необходимости создавать подзапрос.

Если ваш движок базы данных не поддерживает сводную таблицу, вам может потребоваться жестко закодировать столбцы в вашем наборе результатов, как показывает @LajosVeres. Я бы добавил подзапрос "catch-all", чтобы при изменении ваших данных вы не получали нелогичных результатов, например:

select
   e.empname,
   (select count(*) from tasks t where e.empid=t.empid and mark=0) as mark0,
   (select count(*) from tasks t where e.empid=t.empid and mark=5) as mark5,
   (select count(*) from tasks t where e.empid=t.empid and mark=10) as mark10,
   (select count(*) from tasks t where e.empid=t.empid and mark not in (0, 5, 10)) as otherMarks,
   (select count(*) from tasks t where e.empid=t.empid) as marksum        
from       
   employees e
select
   e.empname,
   (select count(*) from tasks t where e.empid=t.empid and mark=0) as mark0,
   (select count(*) from tasks t where e.empid=t.empid and mark=5) as mark5,
   (select count(*) from tasks t where e.empid=t.empid and mark=10) as mark10,
   (select count(*) from tasks t where e.empid=t.empid) as marksum        
from       
   employees e
Другие вопросы по тегам