sql >> データベース >  >> RDS >> Oracle

OracleSQLサンプルデータベース

    クエリをフィルタリングしていないため、すべての従業員が表示されます。

    これにより、部門/学年の最大収入未満の従業員がフィルタリングされます:

    SELECT ename, salgrade.grade, dept.dname
      FROM emp, salgrade, dept
     WHERE emp.sal BETWEEN salgrade.losal AND salgrade.hisal
       AND emp.deptno = dept.deptno
       AND emp.sal = (SELECT MAX(sal)
                        FROM emp emp_in, salgrade grade_in
                       WHERE emp_in.sal BETWEEN grade_in.losal AND grande_in.hisal
                         AND emp_in.deptno = emp.deptno
                         AND grade_in.losal = salgrade.losal)
    

    たとえば、営業担当の2人がグレード2の最大給与を獲得しているため(マーティンとワードの両方が1250を獲得)、重複が見つかります。これは許容できるか、そのうちの1つだけを選択するために他の基準が必要です。

    row_numberを使用できます グレード/部門によって1行のみが返されるようにする分析関数(重複がある場合、Oracleは任意に1行を選択することに注意してください):

    SELECT * FROM (
      SELECT ename, salgrade.grade, dept.dname,
             row_number() OVER (PARTITION BY dept.deptno, salgrade.grade 
                                ORDER BY emp.sal DESC) rnk
        FROM emp, salgrade, dept
       WHERE emp.sal BETWEEN salgrade.losal AND salgrade.hisal
         AND emp.deptno = dept.deptno
    ) WHERE rnk = 1;
    
    ENAME       GRADE DNAME          RNK
    ---------- ------ -------------- ---
    MILLER          2 ACCOUNTING       1 
    CLARK           4 ACCOUNTING       1 
    KING            5 ACCOUNTING       1 
    ADAMS           1 RESEARCH         1 
    FORD            4 RESEARCH         1 
    JAMES           1 SALES            1 
    MARTIN          2 SALES            1 
    ALLEN           3 SALES            1 
    BLAKE           4 SALES            1 
    


    1. 現在のユーザーに基づいてPowerBIレポートをフィルター処理する

    2. XAMPP / MySQL:MySQLの再起動後、単一テーブルのテーブルスペースファイル。\ mysql\innodb_index_stats.ibdを開くことができませんでした

    3. カーリー(スマート)引用符で窒息するMySQL

    4. PHPSQLクエリの結果