1

私は休日システムを構築しており、その機能の 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 列の結果が予想よりも高くなりました。これは奇妙です。なぜなら、合計を削除して 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_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一致する行ごとにから各行のコピーを 1 つ取得することです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 に答える