2017-02-02 47 views
0

我正在嘗試編寫一個mysql查詢,列出所有員工,他們的工作職能以及他們在特定日期所做的所有工作的總成本。這裏是我的表格的相關部分:MYSQL所有員工在特定日期的成本總和

job_function table 
emp_func 
emp_num 


employee table 
emp_name 
emp_num 

job table 
job_date 
emp_num 
job_name 

job_type table 
cost 
job_name 

該查詢的工作原理除了它只返回那天有一份工作的員工。如果一名員工當天沒有工作,他們就沒有出現。我需要展示所有員工,即使那些當天沒有工作的員工。有關如何做到這一點的任何建議?這裏是我的查詢:

SELECT 
employee.emp_name, 
job_function,emp_func, 
SUM(job_type.cost) 
FROM 
employee 
INNER JOIN job ON job.emp_num = employee.emp_num 
INNER JOIN job_function ON job_function.emp_num = employee.emp_num 
INNER JOIN job_type ON job.job_name = job_type.job_name 
where job_date = '2016-04-16' 
group by emp_name; 
+0

你應該在這裏找到你的答案。 http://stackoverflow.com/questions/5706437/whats-the-difference-between-inner-join-left-join-right-join-and-full-join –

+0

還有什麼我需要改變或者它是隻是加入?我認爲這可能是一個加入的問題,但我嘗試了其他幾個,並沒有讓我更接近。 '完整的外部連接'似乎並不適用於MYSQL,至少不是我使用它的方式。 – user2328273

+0

這也有點令人困惑,因爲我加入了4張桌子而不是2張。 – user2328273

回答

0

你需要一個left join以獲得結果,即使在左連接表中沒有適合on條件的行;在這種情況下,左連接表的列中的值將返回爲null

您還需要將您的where條件移至on條件;您的where會另外要求job - 表中的日期爲2016-04-16,因此它必須存在(而不是null),這將使left join再次表現爲join

SELECT 
    employee.emp_name, 
    job_function.emp_func, 
    SUM(job_type.cost) 
FROM employee 
JOIN job_function ON job_function.emp_num = employee.emp_num 
left JOIN job ON job.emp_num = employee.emp_num and job.job_date = '2016-04-16'  
left JOIN job_type ON job.job_name = job_type.job_name 
group by employee.emp_name, job_function.emp_func; 

我也是固定的group by,並且增加了emp_func -column那裏,因爲你選擇該列。否則這會導致MySQL 5.7+中的默認設置發生錯誤,否則可能在員工具有多個功能的情況下給出錯誤結果。

+0

啊,這非常有幫助謝謝。我沒有考慮在連接上使用「AND」。 – user2328273

0

如果你把job_date = '2016-04-16'你只能看到,在這一天工作的員工,你應該刪除WHERE看到所有的員工或把一個間隔像job_date>'2016-04-16' AND job_date<'2016-05-31'

+0

對,但我需要日期。我意識到'where'條款不包括那些員工,但我需要弄清楚如何包含這些員工並保留日期。這與我所得到的一樣接近。它應該顯示所有員工以及當天工作的總成本。如果當天沒有員工工作,則應該顯示總數爲0,而不是完全不包括員工。 – user2328273

+0

哇,我想起你的問題,因爲10分鐘沒有找到解決方案,這有點困難 –

+0

哈哈,很高興它不只是我。 – user2328273

相關問題