1

我正在构建一个假期系统,其中一个功能是能够购买额外的假期,您可以在一年中的几个时间点进行,所以我想查看假期的总天数,预订了多少和每个用户购买了多少。

我正在查询

SELECT  hr_user.name AS username, 
        hr_user.user_id,
        SUM(working_days) AS daysbooked, 
        sum(hr_buyback.days) AS daysbought 
FROM hr_leave 
inner join hr_user on hr_user.user_id = hr_leave.user_id
left outer join hr_buyback on hr_buyback.user_id = hr_user.user_id
where    active = 'y' 
     and hr_leave.start_date between '2012-01-01' and '2012-12-31' 
     and (hr_leave.status = 'approved' OR hr_leave.status = 'pending')
GROUP BY hr_user.name, hr_user.user_id

现在,这使 daysbought 列中的结果 waaaay 比我预期的要高,这很奇怪,因为当我去掉总和而只有 hr_buyback.days 时,它显示了我期望的所有单个值(除了我会更确切地说,它们是相加的)

其次,在 MySQL 中你能做你在 MSSQL 中能做的事吗?

left outer join hr_buyback on (select hr_buyback.user_id where buy_sell = 'buy') = hr_leave.user_id

?

相关表定义(我假设这就是你的意思?):

hr_buyback

buyback_id  int(11) NO  PRI     auto_increment
user_id     int(11) NO          
days        int(11) NO          
buy_sell    varchar(10) NO          
status      varchar(10) NO      pending 
year        int(11) NO      

hr_user

user_id     int(11) NO  PRI     auto_increment
name        varchar(40) NO          
email       varchar(40) NO  UNI     
level       int(5)  YES         
manager_id  int(11) NO          
team_id     int(11) YES         
active      varchar(2)  NO      y   
holidays_day    int(11) NO          
start_date  timestamp   NO      CURRENT_TIMESTAMP   
password    varchar(60) NO          
division_id int(11) YES         
day_change  int(5)  NO      0   
priv_hours  varchar(2)  NO      n   
po_level    int(2)  YES     0   
po_signoff  int(10) YES 

hr_leave

leave_id    int(11) NO  PRI     auto_increment
user_id     int(11) NO          
start_date  date    NO          
end_date    date    NO          
day_type    varchar(10) NO          
status      varchar(20) NO      pending 
working_days    varchar(5)  NO          
leave_type  int(11) NO          
cancel      int(11) NO      0   
date        timestamp   NO      CURRENT_TIMESTAMP   
4

1 回答 1

2

问题可能是您将从hr_buyback中的每个匹配行中获取每行的一个副本hr_leave

我假设每个用户可能有不止hr_buyback一行,并且可能有hr_buyback一行没有hr_leave一行。如果是这样,您可能会想要这样的东西:

SELECT  hr_user.name AS username, 
    hr_user.user_id,
    SUM(working_days) AS daysbooked, 
        (SELECT SUM(days) 
        FROM hr_buyback 
        WHERE hr_buyback.user_id = hr_user.user_id) AS daysbought 
FROM  hr_user  
left join hr_leave on hr_user.user_id = hr_leave.user_id
where    active = 'y' 
 and hr_leave.start_date between '2012-01-01' and '2012-12-31' 
 and (hr_leave.status = 'approved' OR hr_leave.status = 'pending')
GROUP BY hr_user.name, hr_user.user_id
于 2012-10-24T13:55:35.197 回答