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

内部のselect句を使用したSQLの順序付けと、ロールアップによるグループ化

    あなたはこのようなことをすることができます。入力データがないので、SCOTT.EMPを使用しました 代わりに。

    いくつかのことに注意してください。 JOBでグループ化しました 、GROUPING(JOB)を使用しました SELECTの両方 (ラベルTOTALを追加します 要約行の場合)およびORDER BY 。列名を再利用しているのでJOB SELECTで (出力列の場合)、ORDER BY 列名JOBを修飾するように注意する必要があります (明確にするために、SELECTの列ではなく、入力テーブルの列を参照しています。 -これは、ORDER BYの列名の場合のデフォルトになります 資格がありませんでした)。 ORDER BYの列名を修飾する必要がある 次に、FROMのテーブルにエイリアスを作成するように強制しました 句(そうでなければ、完全なテーブル名をどこにでも持ち運ばなければならなかったでしょう)。

    GROUPINGの使用 SELECTの関数 (NVLではなく )JOBの場合、特に重要です nullにすることができます 。 nullのグループは必要ありません ラベル付けするジョブTOTAL -ロールアップ行にのみ必要です。この点は、非常に高度なプログラマーの多くでさえ混乱させます。

    順序を「手動で」決定する方法を示します:PRESIDENT 最初にMANAGER 、次に他のすべてのジョブ(アルファベット順)。優先順位をテーブルなどのどこかに保存している場合は、そのテーブルに結合して、「手動」のCASEの代わりに順序列を使用できます。 クエリ内の式。

    select case grouping(job) when 0 then job else 'TOTAL' end as job
         , sum(sal) as total_salary
    from   scott.emp e
    group  by rollup(job)
    order  by grouping(e.job)       -- to get the total in the last row
            , case e.job when 'PRESIDENT' then 1 when 'MANAGER' then 2 end
            , e.job
    ;
    
    JOB       TOTAL_SALARY
    --------- ------------
    PRESIDENT         5000
    MANAGER           8275
    ANALYST           6000
    CLERK             4150
    SALESMAN          5600
    TOTAL            29025
    



    1. XMLをパラメータとしてOracleのストアドプロシージャに渡す方法

    2. Python:_mysqlとMySQLdbの長所と短所は?

    3. リレーショナルデータベースのセットのクエリ

    4. データベースのユニットテストフレームワーク