2011-12-01 81 views
1

我已經爲大多數早期發現下面的代碼僱用的員工在每一個部門找到最早期僱用的員工在每一個部門

select d.department_name,e.first_name || ' '|| e.last_name,e.hire_date,min(e.hire_date) 
     from employees e join departments d 
     on e.department_id=d.department_id 
    group by d.department_name,e.hire_date 

,但它讓我看到下面的錯誤

ORA-00979: not a GROUP BY expression 
00979. 00000 - "not a GROUP BY expression" 
*Cause:  
*Action: 
Error at Line: 13 Column: 26 

請幫我一下這段代碼有錯嗎?

+2

什麼是你想要做什麼呢? GROUP BY創建彙總行,但您正在嘗試提取單個記錄。 – BNL

回答

1

一旦你爲每個部門最早僱用日期,你可以做一個內部連接到employees表,看看你僱誰從該部門在該日期。

編輯: 這樣的事情應該工作。

select 
    a.department_name, 
    a.EarliestHireDate, 
    b.first_name + ' ' + b.last_name AS EmployeeName 
from 
    (
     select min(e.hire_date) as EarliestHireDate, d.department_name, d.department_id 
     from employees e join departments d 
     on e.department_id=d.department_id 
     group by d.department_name 
    ) as a 
    inner join employees as b 
     on a.EarliestHireDate = b.hire_date 
      and a.department_id = b.department_id 

如果超過一個被僱傭,你會得到各部門的100名多員工是最早租用一天在該部門

+0

已添加SQL示例 –

+0

除了在Oracle中,字符串級聯運算符是'||'而不是''當您創建'EmployeeName'列時這一事實。然而,它通常比分析函數解決方案效率低,因爲它需要兩次敲擊「僱員」表,而不是使用分析函數一次。如果表格很小,這可能不是非常重要,但如果表增長或查詢執行多次,則可能會加起來。就我個人而言,我也傾向於發現分析功能方法更容易閱讀和維護。 –

0
select d.department_name,e.first_name || ' '|| e.last_name,min(e.hire_date) 
     from employees e join departments d 
     on e.department_id=d.department_id 
    group by d.department_name,e.first_name || ' '|| e.last_name 
+1

這將返回*每個*員工的最早僱用日期 - 不是整個部門。 –

1

這樣的查詢無法工作。 爲什麼你是按這些列分組的?你通過這樣做想達到什麼目的?你如何用言語來處理查詢?

在作出查詢,它用英文寫:

最早期聘用的員工是具有最低的(最早)聘用日期,對每個部門的員工。

我不會給你查詢,因爲我覺得這是一個功課,但你應該能夠從這裏下去。

2

您在分組查詢中包含未彙總的非分組字段。

此外,您是由hire_date和部門組成的,所以您的查詢將爲每個部門內的每個不同hire_date返回一行,而不是僅爲每個部門返回一行(儘管這不會停止您的查詢運行,但它會阻止它返回所需的結果。)

考慮查看子查詢或分析函數以返回所需的數據。

1

最簡單的方法通常是在這裏使用分析函數。但是,如果有關係,就會出現皺紋。如果在同一天聘用同一部門的人員不是非常不可能,那麼您是否想要退回這兩個人?或者你想指定一個次要標準來打破平局?或者你只是想讓Oracle隨機破壞領帶?而且,如果你不是在尋找最上面一行,但前3或前5名,你怎麼領帶治療後的行。

這個查詢

select department_name, 
     employee_name, 
     hire_date 
    from (
    select d.department_name, 
      e.first_name || ' '|| e.last_name employee_name, 
      e.hire_date, 
      row_number() over (partition by d.department_name order by e.hire_date asc) rnk 
     from employees e join departments d 
     on e.department_id=d.department_id 
) 
where rnk = 1 

將通過隨機打破關係返回與最早hire_date員工在每一個部門,如果兩名員工都在同一天錄用。如果您使用rankdense_rank函數而不是row_number,則會返回兩行。如果您在分析功能中爲訂單添加了附加條件,則可以確定如何拆分領帶(例如,通過對員工的姓氏進行排序)。