来自三个表的MySQL“内部联接”查询给出错误的结果

问题描述 投票:0回答:1

我正在一个HR项目中,我需要从mysql数据库中调用3个表值,并且需要基于以下一些条件的自定义输出:但是我找不到想要的输出。我是mysql新手,需要您的指导以获取如下输出。预先感谢您的明智建议...

表员工

EMP_ID-EMP_NAME

EID001-TOM

EID002-拉里

表出席率

EMP_ID-EMP_NAME-ATTENDANCE_DATE

EID001-TOM-20200101

EID002-拉里-20200101

EID001-TOM-20200102

EID002-TOM-20200103

EID002-TOM-20200104

表离开记录

EMP_ID-EMP_NAME-LEAVE_DATE(FROM)-LEAVE_DATE(TO)-天-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

mysql
1个回答
0
投票

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

select e.emp_id, e.name, a.working_days, a.casual_leave, a.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
© www.soinside.com 2019 - 2024. All rights reserved.