2014-12-19 54 views
1

我試圖讓1月至11月員工的總工作時間按縣劃分。我只對在過去60天內任何地方工作的員工感興趣。當按多列分組時,MySQL查詢隱藏結果

當我運行此查詢:

SELECT DISTINCT(a.empid) AS EMPL_ID, a.cnty AS COUNTY, SUM(a.hours) AS HRS 
FROM timesheet_lines AS a 
WHERE a.date >= '2014-1-1' 
AND a.date <= '2014-11-30' 
GROUP BY EMPL_ID 
HAVING MAX(a.date) > '2014-10-18'; 

我得到的時間正確的號碼,但它不是由縣級細分。

當我由縣添加分組像這樣的查詢:

SELECT DISTINCT(a.empid) AS EMPL_ID, a.cnty AS COUNTY, SUM(a.hours) AS HRS 
FROM timesheet_lines AS a 
WHERE a.date >= '2014-1-1' 
AND a.date <= '2014-11-30' 
GROUP BY EMPL_ID, COUNTY 
HAVING MAX(a.date) > '2014-10-18'; 

它打破下來的縣,但它消除在這些縣工作過的員工縣和時間誰沒有在那個特定的縣工作在過去的60天。

如何按縣添加故障分析,仍然可以獲得所有工作時間?

這裏是我想拉一個員工數據的一個例子:

EMPL_ID COUNTY HRS 
------- ------ --- 
5461 ONTARIO 105 
5461 WAYNE 1182 
5461 YATES 24 

這裏是我所得到的,當我組僅EMPL_ID:

EMPL_ID COUNTY HRS 
------- ------ --- 
5461 ONTARIO 1311 

具有正確總小時,但它沒有妥善分解由縣。

這裏是我所得到的,當我通過EMPL_ID 縣組:

EMPL_ID COUNTY HRS 
------- ------ --- 
5461 ONTARIO 105 
5461 WAYNE 1182 

現在由縣壞了,但是卻忽略了YATES縣我想是因爲員工沒有在YATES縣工作最近60天。

+0

試着拿出有條款。該行很可能在那裏,但由於分組它正在改變max()值,因此通過具有過濾器而被丟棄。 –

回答

0

首先,您在使用group by時不需要distinct

其次,問題是您的having條款。您需要對員工進行過濾,但需要報告員工/縣的組合。這需要某種子查詢。這裏有一種方法:

SELECT a.empid AS EMPL_ID, a.cnty AS COUNTY, SUM(a.hours) AS HRS 
FROM timesheet_lines AS a 
WHERE a.date >= '2014-01-01' AND a.date <= '2014-11-30' AND 
     a.empid IN (SELECT EmpId 
        FROM timesheet_lines tl 
        GROUP BY EmpId 
        HAVING MAX(date) > '2014-10-18' 
       ) 
GROUP BY EMPL_ID, COUNTY; 

編輯;

in時間過長,有join替換爲:

SELECT a.empid AS EMPL_ID, a.cnty AS COUNTY, SUM(a.hours) AS HRS 
FROM timesheet_lines a JOIN 
     (SELECT EmpId 
     FROM timesheet_lines tl 
     GROUP BY EmpId 
     HAVING MAX(date) > '2014-10-18' 
    ) e 
     on a.EmpId = e.EmpId 
WHERE a.date >= '2014-01-01' AND a.date <= '2014-11-30' 
GROUP BY EMPL_ID, COUNTY; 

其實,我應該這樣開始書面它,但我不知道你的數據有多大(和我認爲IN版本更易於閱讀)。

+0

這可能會也可能不會,但它運行了2個多小時,所以我停下來嘗試另一種解決方案。仍在尋找一個。很明顯,我的timesheet_lines表太大,無法在內部SELECT語句中運行。這似乎是什麼使它需要這麼長時間。 – TBowman

+0

我試圖標記這是有幫助的,但它說我首先需要15個聲望。謝謝! – TBowman

0

這裏是我結束了,而它的偉大工作:

CREATE TEMPORARY TABLE tsltemp 
SELECT empid 
FROM timesheet_lines tl 
GROUP BY empid 
HAVING MAX(date) > '2014-10-18'; 


SELECT a.empid AS EMPL_ID, a.cnty AS COUNTY, SUM(a.hours) AS HRS 
FROM timesheet_lines AS a 
WHERE a.date >= '2014-01-01' AND a.date <= '2014-11-30' 
    AND a.empid IN (SELECT empid FROM tsltemp) 
GROUP BY EMPL_ID, COUNTY; 

這是令人驚訝的速度更快。謝謝Gordon讓我走上正軌!