【问题标题】:MySQL “Inner Join” query from three tables giving wrong result来自三个表的 MySQL “Inner Join”查询给出了错误的结果
【发布时间】:2020-06-05 15:30:18
【问题描述】:

我正在做一个 HR 项目,我需要从 mysql 数据库中调用 3 个表值,并且需要基于以下一些标准的自定义输出: 但我无法获得我正在寻找的输出。我是 mysql 新手,需要您的指导来获得如下输出。提前感谢您的明智建议...

表员工

EMP_ID - EMP_NAME

EID001 - 汤姆

EID002 - 拉里

餐桌出勤

EMP_ID - EMP_NAME - ATTENDANCE_DATE

EID001 - 汤姆 - 20200101

EID002 - 拉里 - 20200101

EID001 - 汤姆 - 20200102

EID002 - 汤姆 - 20200103

EID002 - 汤姆 - 20200104

Table Leave_Record

EMP_ID - EMP_NAME - LEAVE_DATE(FROM) - LEAVE_DATE(TO) - DAYS - LEAVE_TYPE

EID002 - 拉里 - 20200102 - 20200102 - 1 - 休闲

EID002 - 拉里 - 20200103 - 20200103 - 1 - 生病了

EID002 - 拉里 - 20200104 - 20200104 - 1 - 年度

查看输出

EMP_ID - EMP_NAME - WORKING_DAYS - CASUAL_LEAVE - SICK_LEAVE - ANNUAL_LEAVE

EID001 -TOM - 4 - 0 - 0 - 0

EID002 - 拉里 - 4 - 1 - 1 - 1

MySql 查询: SELECT EMP_ID, EMP_Name, SUM(Attendance. ATTENDANCE_DATE!='') as WORKING_DAYS, SUM(Leave_Record.LEAVE_TYPE='CASUAL') as CASUAL, SUM(Leave_Record.LEAVE_TYPE=SICK) as SICK , SUM(Leave_Record.LEAVE_TYPE=ANNUAL) as ANNUAL from Employee, Attendance, Leave_Record where Attendance. EMP_ID = Employee. EMP_ID AND Employee. EMP_ID = Leave_Record. EMP_ID GROUP BY Employee. EMP_ID order by Employee. EMP_ID

【问题讨论】:

  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 第一个表达式的代码没有给出你的期望,说出你的期望和原因。请参阅编辑帮助重新代码块。

标签: mysql sql join group-by sum


【解决方案1】:

您在两个表中都有多个匹配的行,因此外部聚合会产生错误的计数。您通常会先聚合子查询,然后加入外部查询:

select 
    e.emp_id, 
    e.name, 
    coalesce(a.working_days, 0) working_days, 
    coalesce(cl.casual_leave, 0) casual_leave, 
    coalesce(cl.sick_leave, 0) sick_leave
from employee e
left join (
    select emp_id, count(*) working_days from attendance group by emp_id
) a on a.emp_id = e.emp_id
left join (
    select 
        emp_id, 
        sum(case when leave_type = 'casual' then days end) casual_leave,
        sum(case when leave_type = 'sick' then days end) sick_leave
    from leave_record
    group by emp_id
) cl on cl.emp_id = e.emp_id

如果leave_record(days)总是1,那么第二个子查询可以简化为:

left join (
    select 
        emp_id, 
        sum(leave_type = 'casual') casual_leave,
        sum(leave_type = 'sick') sick_leave
    from leave_record
    group by emp_id
) cl on cl.emp_id = e.emp_id

【讨论】:

  • 您好,GMB,现在结果完美显示......感谢你的百万......
猜你喜欢
  • 2016-09-20
  • 1970-01-01
  • 2016-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多