ВЫБЕРИ сотрудников с количеством выполненных задач
Как бы сделать следующее в 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