2014-02-11 2 views
2

Я использую MySQL 5.1, и у меня есть две таблицы, проекты и сотрудники. Существует внешний ключ в employee (number_project), который является основным ключом проектов (code_project).MySQL - группа по SUM с двумя таблицами

---> Ровно: SQL Fiddle

Я пытаюсь получить SUM проектов по отделам с этим запросом:

SELECT emp.department_emp AS Department, SUM(pro.price) AS total_department 
FROM employee AS emp, projects AS pro 
WHERE emp.number_project = pro.code_project 
GROUP BY emp.department_emp 

возвращает:

DEPARTMENT TOTAL_DEPARTMENTA 
Accounting 2600 
IT   4200 

Но это следует возвращать:

DEPARTMENT TOTAL_DEPARTMENT 
Accounting 1300 
IT   4200 

Проблема заключается в том, что когда запрос суммирует те же проекты много раз, когда сотрудники одного и того же отдела работают в этом проекте.

Спасибо!

+1

Что вы будете делать, если два сотрудника из разных отделов работают над одним и тем же проектом? –

ответ

0

Используйте подзапрос, чтобы создать список уникальных комбинаций (department, project):.

select e.department_emp 
,  sum(p.price) 
from (
     select distinct department_emp 
     ,  number_project 
     from Employee 
     ) e 
join Projects p 
on  p.code_project = e.number_project 
group by 
     e.department_emp 

Working example at SQL Fiddle.

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

+0

Спасибо за ваш ответ. Я знаю, что в базе данных это не хорошо. Я просто пытаюсь сделать некоторые практики – user2592044

0

Вы можете использовать подзапрос, «коллапсирует» сотрудники, произвольно выбирая отделение одного сотрудника из проекта:

SELECT department, 
     SUM(price) AS total_department 
    FROM (SELECT project.code_project AS project, 
       project.price AS price, 
       MIN(employee.department_emp) AS department 
      FROM project 
      JOIN employee 
      ON project.code_project = employee.number_project 
     GROUP 
      BY project.code_project, 
       project.price 
     ) 
GROUP 
    BY department 
; 

(Естественно, это даст ошибочные результаты, если один проект имеет сотрудников из нескольких различные отделы, потому что он будет назначать полную стоимость проекта одного из этих отделов)

+0

Как вы говорите в конце, этот ответ не имеет никакого смысла. Зачем публиковать его? – Andomar

+0

@Andomar. , , Ваше решение возвращает неверные результаты, если сотрудники проекта могут быть в нескольких отделах. Ваша критика кажется несправедливой. –

+0

@GordonLinoff: Произвольное назначение проекта отделу (или, скорее, первому алфавитному отделу) не имеет смысла - если вы не работаете на «_AAccounting», я думаю. Вы хорошо разбираетесь в проектах с двойным подсчетом, но это было бы нормально в отношении «того, каков объем этого раздела, связанного с типом запроса». – Andomar

0

ВЫБРАТЬ emp.department_emp AS отдела, SUM (pro.price) AS total_department FROM (SELECT DISTINCT * FROM сотрудника AS эми, проекты AS про WHERE emp.number_project = pro.code_project ) AS P GROUP BY emp.department_emp

Смежные вопросы