2011-03-18 99 views
1

我有一個問題,因爲我沒有如此強大的查詢。如何查詢另一個查詢結果?

我有一個查詢與由兩個選擇查詢的工會:

SELECT em.emp_code, 
      em.emp_name, 
      COALESCE(SUM(pe.hours_allotted),0) AS hours, 
      pe.dated 
    FROM employee_master em 
LEFT JOIN project_employee pe ON (pe.Emp_code = em.emp_code) 
    WHERE (dated >= '2011-03-14' 
     AND dated < '2011-03-20') 
     OR dated IS NULL 
GROUP BY em.emp_code 
UNION 
    (SELECT em.emp_code, 
      em.emp_name, 
      '0' AS hours, 
      pe.dated 
    FROM employee_master em 
LEFT JOIN project_employee pe ON (pe.Emp_code = em.emp_code) 
    WHERE (dated >= '2011-03-14' 
     AND dated < '2011-03-20') 
     OR dated IS NOT NULL 
GROUP BY em.Emp_code) 
ORDER BY emp_name; 

現在的結果集返回,例如爲:

ecode ename hours 
---------------------- 
201 Alak basu 10 
201 alak basu 0 

的第一個結果是,從第一個select語句的工會,其中小時= 10 和小時= 0來自工會的第二選擇聲明。

我要的是:

ecode  ename  hours 
---------------------------- 
201  alak basu  10 

一樣的情況下,應該有每個ECODE只有一個結果。如何按照生態小組的方式總結小時數,使它只給出上述一個結果?

+0

爲什麼你的數據,從而打破與不同的資本具有相同的名稱兩次? – 2011-03-18 04:45:40

+0

我覺得這裏有一個邏輯失敗需要解決。如果員工在給定的時間範圍內有「過期」字段,則它將與兩個查詢匹配,並存在於工會的兩側。我有一種感覺,這是不是打算。這個查詢的預期效果究竟是什麼? – jdmichal 2011-03-18 04:58:55

+0

@jdmichal實際上打算是我們有一個出勤基礎的事情,我們必須在每天工作多少小時的工作......現在我們需要知道從3月14日到3月19日..有多少人實際工作誰的工作時間超過6小時....(注意:只有那些員工會在項目員工那天工作..) – Joy 2011-03-18 08:41:42

回答

2

你總是可以這樣做:

select emp_code, min(emp_name) as emp_name, sum(hours) 
from (
    <your original query here> 
) as e 
group by emp_code 
order by emp_name; 
+0

感謝優秀ans ....正是我一直在尋找:) – Joy 2011-03-18 04:57:16

2

如果希望的結果是將單個員工代碼的所有小時數總和爲一行,而第二個查詢後的返回值只會返回零小時,那麼似乎這裏最好的解決辦法是擺脫UNION

編輯:進一步澄清後,這裏就是我認爲的SQL或許應該是這樣的:

SELECT em.emp_code, 
     em.emp_name, 
     COALESCE(pe.hours, 0) AS hours 
FROM employee_master em 
LEFT JOIN (
    SELECT emp_code, 
      SUM(hours_allotted) AS hours 
    FROM project_employee 
    WHERE dated >= '2011-03-14' AND 
      dated < '2011-03-20' 
    GROUP BY emp_code 
    ) pe ON (pe.emp_code = em.emp_code) 
ORDER BY em.emp_name; 

它在做什麼:

  1. 執行子查詢中過濾所有project_employee條目的那些指定的日期範圍。 (請注意,在此處不需要NULLNOT NULL檢查。日期在範圍內,或者不在此範圍內。)
  2. 在子查詢中生成的每個員工代碼的小時數總和。
  3. employee_master表格中的所有員工爲對象,並在已過濾的總和project_employee子查詢結果集中搜索匹配的條目。 (由於它是一個LEFT JOIN,在主表中的每個僱員將有一個條目,即使沒有過濾project_employee條目的匹配。)
  4. 在這種情況下不存在匹配,則pe.hours列將爲NULL,引起COALESCE恢復到其第二個零值。
  5. 訂單結果emp_name
+0

@jdmichal但問題是我有兩套具有完全不同的條件...一個採取日期爲空,另一個採取日期不是空....所以我不能擺脫工會:( – Joy 2011-03-18 04:52:34

+0

如果他們是不同的條件,那麼爲什麼你的例子給同一個員工兩次?或者,這是什麼問題? – jdmichal 2011-03-18 04:54:10

+0

@jdmichal,+1一致。第二部分似乎並不需要,並且在這種情況下,一個案例陳述 – 2011-03-18 04:56:57

相關問題