0

部門ごとに最年少の従業員を表示するのに問題があります。

、という名前の別のテーブルがありますdepartment。これは、単に部門番号と部門名を示しています。WHERE EXISTS句も試しましたが、うまくいきませんでした。

   SELECT emp_department_number, 
          emp_name, 
          MIN(TRUNC(((current_date - emp_dateofbirth)/(365.25)))) "age" 
     FROM employee
 GROUP BY emp_department_number, emp_name
 ORDER BY emp_department_number;

私もこれを持っていますが、同じ結果が生成されます。

 SELECT emp_department_number, emp_name, min(TRUNC(((current_date -      emp_dateofbirth)/(365.25)))) "age" from employee
 JOIN department
 ON dpt_num=emp_department_number
 WHERE EXISTS (select min(emp_dateofbirth) from employee)
 GROUP BY emp_department_number, emp_name
 order by emp_department_number;



 EMP_DEPARTMENT_NUMBER EMP_NAME                        age
 -------------- ------------------------------ ----------
 1              Ramon, Emma                           25
 1              Tin, Rina                             69
 3              Mason, John                           68
 3              Roberson, Wayne                       50
 3              Zan, Shelis                           51
 7              Hockman, Ronnie                       62
 7              Lam, Annie                            37
 7              Smith, Ramon                          60
4

3 に答える 3

1

これは、分析関数を使用して行うことができますROW_NUMBER()(名前を取得するために、departmentテーブルに潜在的な結合を追加しました)。

SELECT dept_name, empl, age
FROM (
  SELECT EMP_DEPARTMENT_NUMBER AS dept,
       EMP_NAME AS empl,
       TRUNC((CURRENT_DATE - emp_dateofbirth) / 365.25) AS age,
       ROW_NUMBER() OVER (PARTITION BY EMP_DEPARTMENT_NUMBER ORDER BY emp_dateofbirth ASC) AS rn
  FROM employee
) E
JOIN department d
  ON e.dept = d.dept_id
WHERE rn = 1
于 2012-10-04T04:03:43.613 に答える
1

Oracleを使用MONTHS_BETWEENしているため、正確な年齢を計算するために使用できます。そして、最年少を見つけるために、あなたは年齢計算をスキップしてemp_dateofbirth直接使うことができます。

 SELECT emp_department_number, emp_name
      , trunc(MONTHS_BETWEEN(emp_dateofbirth, current_date)/12) as age
   from employee e
  WHERE e.emp_dateofbirth = (
        SELECT MAX(emp_dateofbirth) 
          FROM employee x
         WHERE x.emp_department_number = e.emp_department_number )

「各従業員について、彼の誕生日が彼の部門の最大誕生日と等しい場合は、それを返却してください」と読むことができます。

于 2012-10-04T09:02:47.813 に答える
0

私があなたを正しく理解しているなら、あなたが必要とするのはFIRST_VALUE分析関数です:

SELECT emp_department_number,
       emp_name,
       TRUNC((CURRENT_DATE - emp_dateofbirth) / 365.25) age
  FROM employee
 WHERE emp_num IN
        ( SELECT FIRST_VALUE(emp_num) OVER
                    ( PARTITION BY emp_department_number
                          ORDER BY emp_dateofbirth DESC
                    )
            FROM employee
           GROUP
              BY emp_department_number
        )
;
于 2012-10-04T03:51:46.017 に答える