Oracle GROUP BY、HAVINGセクションおよび適用


GROUP BY


Oracle SQLでは、GROUP BYセクションを使用してグループの数または合計を取得できます.

SELECT STY_NM
       , SUM(SALE_QTY) AS SALE_QTY
 FROM STY
 WHERE 1=1
 GROUP BY STY_NM
前述したように、GROUP BYを使用して、スタイル別の販売数を得ることができる.
  • GROUP BY統計では、
    HAVINGセクションで条件セクションを追加できます.
  • HAVING


    SELECTゲートにHAVINGと書くことが多いようです
    HAVINGセクションは、WHEREセクションのようにGROUP BY統計値の条件を追加することができる.

    基本構文

    SELECT [GROUP BY 절에 지정된 컬럼명1], [GROUP BY별로 집계할 컬럼명2]
    FROM [테이블명]
    WHERE 1=1 <WHERE 생략이 가능하다.>
    GROUP BY [그룹으로 묶을 컬럼명]
    HAVING [조건]

    SELECT STY_NM
           , SUM(SALE_QTY) AS SALE_QTY
     FROM  STY
    WHERE 1=1 
    GROUP BY STY_NM
    HAVING SUM(SALE_QTY) BETWEEN 500 AND 700
    たとえば、
    HAVING祭りがなければ、バンドルされた果物や販売数はすべて調べられますが、HAVINGSUM(SALE QTY)BETWEEN 500 AND 700が追加された後、STYNMの販売数は500と700の間の値しか調べられません.

    重複データの表示

    SELECT CUST_ID,
           CUST_NM,
           COUNT(*)
    FROM TEMP_TEST
    WHERE 1=1 
    GROUP BY CUST_ID, CUST_NM
    HAVING COUNT(*) > 1
    GROUP BYを重複データを検索する列に設定し、HAVINGセクションでCOUNT(*)>1の条件を設定して重複データを問合せます.

    ROLLUP


    ROLLUP構文は、GROUP BYセクションとともに使用され、GROUP BYセクションでグループ化されます.
    コレクション結果に対してより詳細な情報を返す機能を実行します.
    SELECTセクションでは、通常のSELECTデータとそのデータの合計をROLLUPを使用して取得できます.

    小計合計

    SELECT SALE_DT       AS 판매날짜
           , FRUIT_CD      AS 품목
           , SUM(SALE_QTY) AS 판매수량
    FROM FRUIT_TABLE
    WHERE 1=1
    GROUP BY ROLLUP(SALE_DT,FRUIT_CD)

    結果から,ROLLUP(SALEDT,FRUIT CD)により総和と小計を求めた.
    ROLLUPは、1列目の合計データとすべての合計データを出力します.
    SALE DTとFRUIT CDの位置を変更した場合、FRUIT CDの合計データと
    合計データをすべて出力します.

    合計出力

    SELECT SALE_DT       AS 판매날짜
           , FRUIT_CD      AS 품목
           , SUM(SALE_QTY) AS 판매수량
    FROM FRUIT_TABLE
    WHERE 1=1
    GROUP BY ROLLUP((SALE_DT,FRUIT_CD))

    全ての合計データをROLLUP(SALE DT、FRUIT CD)で出力できます.

    GROUPING, GROUPING_ID


    GROUPING関数には1つのパラメータしかありません.GROUPING ID関数には複数のパラメータを入力できます.

    SELECT DECODE(GROUPING_ID(FRUIT_NUM,FRUIT_CD),3,'합계',FRUIT_NUM) AS 과일번호,
           CASE WHEN GROUPING_ID(FRUIT_NUM,FRUIT_CD) = 1 THEN 
           		 DECODE(GROUPING_ID(FRUIT_NUM,FRUIT_CD),1,'',FRUIT_CD)
           ELSE DECODE(GROUPING_ID(FRUIT_NUM,FRUIT_CD),1,'소계',FRUIT_CD)
           END 과일
           , SUM(SALE_QTY) AS 판매수량
           , GROUPING_ID(FRUIT_NUM,FRUIT_CD) AS GROUPING_ID복수
    FROM FRUIT_TABLE
    WHERE 1=1
    GROUP BY ROLLUP(FRUIT_NUM,FRUIT_CD)


    GROUPING ID関数は、複数のカラムをパラメータとして使用できます.
    パラメータのカラム順序に従って、カラムがNULLの場合は1を返し、1行をバイナリとします.
    サンプル画像の表示

  • 3行目を見ると、果物番号にはデータがあり、ゼロの果物のデータはありません.
    つまり、0001は1を返します.(11行目も同じ内容)

  • 20行目を見ると、フルーツ番号とフルーツのデータがなく、1と1
    すなわち、0011は3を返す.

  • GROUPING IDを使用し、NULL部分にDECODEを使用して合計と小計を追加することで、データを簡単に見ることができます.