私は休日システムを構築しており、その機能の 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