0

SQLを使用していくつかの情報を選択しようとしていますが、成功しません。これが私がやろうとしていることです。

私は2つのテーブルを持っています:

次の列を持つテーブル従業員:

IDemployee | name    | surname  | department_id
1          | John    | Smith    | 1
2          | Jane    | Smith    | 1
3          | Neo     | Anderson | 1
4          | John    | Mason    | 2
5          | James   | Cameron  | 2
6          | Morpheus| Grumpy   | 2

列のあるテーブル部門:

IDdepartment | name
1            | Thieves
2            | Madmen

すべての部門の最初と最後の従業員の名前とその従業員数を選択したいと思います。結果:

department_name | first_employee | last_employee | employee_count
Thieves         | Smith          | Anderson      | 3
Madmen          | Mason          | Grumpy        | 3

次のクエリで、最初と最後の従業員の数とIDを取得できました。

SELECT d.IDdepartment, COUNT(*) as "employee_count", MIN(e.IDemployee) as "first_employee", MAX(e.IDemployee) as "last_employee"
        FROM ( employees e INNER JOIN departments d ON d.IDdepartment=e.department_id)
        GROUP BY d.name;

しかし、私は彼らの名前を選択する正しい方法を見つけることができません。どんな助けでも大歓迎です。

4

2 に答える 2

0

これは、既存のOracleテーブルに基づく一般的なOracleの例です。ご使用のバージョンのSQLで使用可能な場合は、分析関数を使用する必要があります。使用しているSQLは指定しません。FIRST()およびLAST()分析f-nsがSQLで使用可能な場合、これは機能するはずです。

SELECT empno, deptno, sal,
   MIN(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) "Lowest",
   MAX(sal) KEEP (DENSE_RANK LAST ORDER BY sal) OVER (PARTITION BY deptno) "Highest"
 FROM scott.emp
ORDER BY deptno, sal
/

See lowest and highest salary by dept in output of above query:

DEPTNO  SAL     Lowest  Highest
---------------------------------
10      1300    1300    5000
10      2450    1300    5000
10      5000    1300    5000
20      800     800     3000
20      1100    800     3000
20      2975    800     3000
....
于 2013-02-06T19:26:21.777 に答える
0

別の方法があるかもしれませんが、1つの方法は、クエリをサブクエリとして使用することです。

SELECT d.name department_name, 
  e.surname first_employee,
  e2.surname last_employee,
  t.employee_count
FROM (
    SELECT d.IDdepartment, 
       COUNT(*) as "employee_count", 
       MIN(e.IDemployee) as "first_employee", 
       MAX(e.IDemployee) as "last_employee"
    FROM employees e 
          INNER JOIN departments d 
            ON d.IDdepartment=e.department_id
    GROUP BY d.name
  ) t JOIN employees e on t.first_employee = e.IDemployee
  JOIN employees e2 on t.last_employee = e2.IDemployee
  JOIN departments d on t.IDdepartment = d.IDdepartment

そしてここにフィドルがあります:http ://sqlfiddle.com/#!2/17a5b/2

幸運を。

于 2013-02-06T19:31:15.790 に答える