MySQL-带两个表的按和分组

MySQL-带两个表的按和分组,mysql,sql,group-by,sum,Mysql,Sql,Group By,Sum,我使用的是MySQL 5.1,我有两个表,projects和employee。员工编号项目中有一个外键,它是projectscode\u项目的主键 -->确切地说: 我正在通过此查询尝试按部门获取项目总数: SELECT emp.department_emp AS Department, SUM( pro.price ) AS total_department FROM employee AS emp, projects AS pro WHERE emp.number_project = pro

我使用的是MySQL 5.1,我有两个表,projects和employee。员工编号项目中有一个外键,它是projectscode\u项目的主键

-->确切地说:

我正在通过此查询尝试按部门获取项目总数:

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
问题是,当同一部门的员工在同一个项目中工作时,当查询对同一个项目进行多次求和时


谢谢

您可以使用折叠员工的子查询,从项目中任意选择一名员工的部门:

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
;

当然,如果单个项目有来自多个不同部门的员工,这会产生误导性的结果,因为它会将项目的全部价格分配给其中一个部门。

使用子查询创建唯一的部门、项目组合列表:

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

您的数据库可能需要一些认真的工作。员工与项目之间应该是多对多关系,而不是多对一关系。名为number的字段不应在另一个表中被称为code。

选择emp.department\u emp作为department,SUM pro.price作为total\u department 从选择不同* 员工作为emp,项目作为专业人员 其中emp.number\u项目=专业代码\u项目 AS P
按emp.department\u emp分组

正如你最后所说,这个答案毫无意义。为什么要发布它?@Andomar。如果一个项目的员工可能在多个部门,您的解决方案将返回错误的结果。你的批评似乎不公平。@GordonLinoff:任意地将一个项目分配给一个部门,或者更确切地说,按字母顺序排列的第一个部门是没有意义的——我想,除非你为会计工作。关于重复计算项目,你说得很好,但这是正常的,因为这个部门在类型查询中涉及多少资本支出。@Andomar。一个项目中有多个员工。每个员工在他们自己的部门。这是两种方法的问题。如果这种情况不能发生,那么它可能与OPs情况无关,因为某种原因。@Andomar:你的回答也毫无意义:它在同样的情况下给出了误导性的结果。然而,你把它贴了出来。如果两名来自不同部门的员工在同一个项目上工作,你会怎么做?谢谢你的回答。我知道数据库不好。我只是想练习一下