'(DB) Oracle/SQL.통계-통계함수'에 해당되는 글 6건

  1. 2017.01.21 Oracle - ROLLUP예제1
  2. 2017.01.21 Oracle - RANK()
  3. 2017.01.21 Oracle - RANK()
  4. 2017.01.21 Oracle - LAG.LEAD()
  5. 2017.01.21 Oracle - ROLLUP
  6. 2017.01.21 Oracle - GROUPING / GROUPING_ID

[ Oracle - ROLLUP예제1 ]

 


 
WITH t AS 
( 
SELECT 'A1' g1, 'B1' g2, 'MM' unit, 10 qty FROM dual 
UNION ALL SELECT 'A1' G1, 'B2' G2, 'EA' UNIT, 20 QTY FROM dual 
UNION ALL SELECT 'A2' G1, 'B2' G2, 'EA' UNIT, 15 QTY FROM dual 
) 
SELECT g1, g2, unit 
, SUM(qty) qty 
FROM t 
GROUP BY ROLLUP(g1, (g2, unit)) 
;

'(DB) Oracle > SQL.통계-통계함수' 카테고리의 다른 글

Oracle - RANK()  (0) 2017.01.21
Oracle - RANK()  (0) 2017.01.21
Oracle - LAG.LEAD()  (0) 2017.01.21
Oracle - ROLLUP  (0) 2017.01.21
Oracle - GROUPING / GROUPING_ID  (0) 2017.01.21
Posted by 농부지기
,

[ Oracle - RANK() ]

 


 

[초기 DATA]
A
 1
A 2
A 3
A 4
A 5
B 1
B 2
C 1
C 2
C 3
C 4

-- 결과 : 아래와 같은 결과를 나오게 처리

A 1 시작 
A 2
A 3
A 4
A 5 종료
B 1 시작
B 2 종료
C 1 시작
C 2
C 3
C 4 종료
D 1 시작/종료
;

--방법 1
WITH T AS( 
    SELECT 'A' GB, 1 NO FROM DUAL UNION ALL
    SELECT 'A' GB, 2 NO FROM DUAL UNION ALL
    SELECT 'A' GB, 3 NO FROM DUAL UNION ALL
    SELECT 'A' GB, 4 NO FROM DUAL UNION ALL
    SELECT 'A' GB, 5 NO FROM DUAL UNION ALL
    SELECT 'B' GB, 1 NO FROM DUAL UNION ALL
    SELECT 'B' GB, 2 NO FROM DUAL UNION ALL
    SELECT 'C' GB, 1 NO FROM DUAL UNION ALL
    SELECT 'C' GB, 2 NO FROM DUAL UNION ALL
    SELECT 'C' GB, 3 NO FROM DUAL UNION ALL
    SELECT 'C' GB, 4 NO FROM DUAL UNION ALL
    SELECT 'D' GB, 1 NO FROM DUAL
)
SELECT
 GB
     , DECODE(GB, BEF_GB, '', '시작') ||
       DECODE(GB, AFG_GB, '', DECODE(GB, BEF_GB, '', '/') || '종료')
  FROM (
        SELECT GB
             , LAG(GB, 1)  OVER(ORDER BY GB) BEF_GB
             , LEAD(GB, 1) OVER(ORDER BY GB) AFG_GB
          FROM T
       ) ;

--방법 2
WITH T AS( 
SELECT 'A' GB, 1 NO FROM DUAL UNION ALL 
SELECT 'A' GB, 2 NO FROM DUAL UNION ALL 
SELECT 'A' GB, 3 NO FROM DUAL UNION ALL 
SELECT 'A' GB, 4 NO FROM DUAL UNION ALL 
SELECT 'A' GB, 5 NO FROM DUAL UNION ALL 
SELECT 'B' GB, 1 NO FROM DUAL UNION ALL 
SELECT 'B' GB, 2 NO FROM DUAL UNION ALL 
SELECT 'C' GB, 1 NO FROM DUAL UNION ALL 
SELECT 'C' GB, 2 NO FROM DUAL UNION ALL 
SELECT 'C' GB, 3 NO FROM DUAL UNION ALL 
SELECT 'C' GB, 4 NO FROM DUAL UNION ALL 
SELECT 'D' GB, 1 NO FROM DUAL 
) 
SELECT GB, NO, SUBSTR( DECODE( NO, 1,'/시작' )||DECODE( NO, MAXS,'/종료' ), 2 ) STR 
FROM ( 
      SELECT GB, NO, MAX(NO) OVER( PARTITION BY GB ) MAXS 
        FROM T 
     );

'(DB) Oracle > SQL.통계-통계함수' 카테고리의 다른 글

Oracle - ROLLUP예제1  (0) 2017.01.21
Oracle - RANK()  (0) 2017.01.21
Oracle - LAG.LEAD()  (0) 2017.01.21
Oracle - ROLLUP  (0) 2017.01.21
Oracle - GROUPING / GROUPING_ID  (0) 2017.01.21
Posted by 농부지기
,

[ Oracle - RANK() ]

  1. RANK()

 

정의 : 순위부여하기. 이때 동일한 점수는 돌인한 순위가 나와야 

 예   : 점수 - 100, 90, 90, 80 
        순위
 - 1,2,2,4    이렇게 나오기

SELECT empno, ename, jumsu
    ,  RANK() OVER (ORDER BY jumsu DESC ) as rk
     FROM example; 

  2. DENSE_RANK()

 

정의 : 중복 RANK 수와 무관하게 numbering 한다. 
   : 점수 - 100, 90, 90, 80 
       순위
 - 1,2,2,3    이렇게 나오기

SELECT empno, ename, jumsu
    ,  DENSE_RANK() OVER (ORDER BY jumsu DESC ) as rk
     FROM example; 

'(DB) Oracle > SQL.통계-통계함수' 카테고리의 다른 글

Oracle - ROLLUP예제1  (0) 2017.01.21
Oracle - RANK()  (0) 2017.01.21
Oracle - LAG.LEAD()  (0) 2017.01.21
Oracle - ROLLUP  (0) 2017.01.21
Oracle - GROUPING / GROUPING_ID  (0) 2017.01.21
Posted by 농부지기
,

[ Oracle - LAG.LEAD() ]

 

 문제

 

  no | str | group |
  
------------------
  1  | ab  |   0   |
  
2  | cd  |   0   |
  3  | ef  |   0   |
  4  | gh  |  60   |
  5  | ij  |   0   |
  6  | kl  |   0   |
  7  | mn  |   30  |
  8  | mn  |   30  |
  9  | mn  |   0   |

이런 형식의 자료가 있습니다.
order
 by  no 기준으로 하면서 group 컬럼을 데이터 순서에 따라서 그룹을 지을  있는방법이 있나요?
말로 설명하자니  설명이 안되네요...아래 원하는 "zz" 컬럼 데이터 입니다.
도움 주시면 정말 감사하겠습니다...

  no | str | GRP   | B_GRP  |
  
---------------------------
  1  | ab  |   0   |    1   |
  2  | cd  |   0   |    1   |
  3  | ef  |   0   |    1   |
  4  | gh  |  60   |    2   |
  5  | ij  |   0   |    3   |
  6  | kl  |   0   |    3   |
  7  | mn  |  30   |    4   |
  8  | mn  |  30   |    4   |
  9  | mn  |   0   |    5   |

LAG  현재 게시물의  게시물 LEAD  현재 게시물의  게시물을 가져올수 있다.
LAG([가져올 컬럼명], [가져올 레코드 ]) OVER(ORDER BY [정렬할 컬럼 ] [정렬 방식])
LEAD([가져올 컬럼명], [가져올 레코드 ]) OVER(ORDER BY [정렬할 컬럼 ] [정렬 방식])
;

WITH T AS( 
    SELECT 1 NO, 'ab' STR,  '0' GRP FROM DUAL UNION ALL
    SELECT 2 NO, 'cd' STR,  '0' GRP FROM DUAL UNION ALL
    SELECT 3 NO, 'ef' STR,  '0' GRP FROM DUAL UNION ALL
    SELECT 4 NO, 'gh' STR, '60' GRP FROM DUAL UNION ALL
    SELECT 5 NO, 'ij' STR,  '0' GRP FROM DUAL UNION ALL
    SELECT 6 NO, 'kl' STR,  '0' GRP FROM DUAL UNION ALL
    SELECT 7 NO, 'mn' STR, '30' GRP FROM DUAL UNION ALL
    SELECT 8 NO, 'mn' STR, '30' GRP FROM DUAL UNION ALL
    SELECT 9 NO, 'mn' STR,  '0' GRP FROM DUAL 
) 
SELECT NO, STR, GRP, SUM(DECODE(GRP, BEF_GRP, 0, 1)) OVER(ORDER BY NO) B_GRP
  FROM (
        SELECT NO, STR, GRP, LAG(GRP, 1) OVER(ORDER BY NO) BEF_GRP
          FROM T
        ORDER BY NO
       )
  ;

'(DB) Oracle > SQL.통계-통계함수' 카테고리의 다른 글

Oracle - ROLLUP예제1  (0) 2017.01.21
Oracle - RANK()  (0) 2017.01.21
Oracle - RANK()  (0) 2017.01.21
Oracle - ROLLUP  (0) 2017.01.21
Oracle - GROUPING / GROUPING_ID  (0) 2017.01.21
Posted by 농부지기
,

[ Oracle - ROLLUP ]

 

☞ ROLLUP 예제1

 

원하는 결과 ] 
    --------------------------------------------------------------------------
      계정명           전표일자     일련번호     차변금액         대변금액 
    --------------------------------------------------------------------------
    인건비            2010.01.01        1           100
    인건비            2010.01.01        2           110
    인건비            2010.03.03        1           110
    인건비            2010.03.04        1                            50
    
인건비계                                        270
    차량유지비        2010.02.14      300            50
    차량유지비       2010.02.26        3            20
    차량유지비        2010.03.15       50           100
    
차량유지비계                                    150
    
총계                                            570              50 

SQL : 
   
WITH DATA1 AS (
       SELECT '인건비'     AS NAME, '2010.01.01' AS DATE1, 1   AS NUMBER1, 100  AS AMT1, NULL  AS AMT2, '비고1' AS NOTES FROM DUAL UNION ALL
       
SELECT '인건비'     AS NAME, '2010.01.01' AS DATE1, 1   AS NUMBER1, 100  AS AMT1, NULL  AS AMT2, '비고2' AS NOTES FROM DUAL UNION ALL
       
SELECT '인건비'     AS NAME, '2010.02.01' AS DATE1, 2   AS NUMBER1, 110  AS AMT1, NULL  AS AMT2, '비고3' AS NOTES FROM DUAL UNION ALL
       
SELECT '인건비'     AS NAME, '2010.03.03' AS DATE1, 1   AS NUMBER1, 110  AS AMT1, NULL  AS AMT2, '비고4' AS NOTES FROM DUAL UNION ALL
       
SELECT '인건비'     AS NAME, '2010.03.04' AS DATE1, 1   AS NUMBER1, NULL AS AMT1, 50    AS AMT2, '비고5' AS NOTES FROM DUAL UNION ALL
       
SELECT '차량유지비' AS NAME, '2010.02.14' AS DATE1, 300 AS NUMBER1, 50   AS AMT1, NULL  AS AMT2, '비고6' AS NOTES FROM DUAL UNION ALL
       
SELECT '차량유지비' AS NAME, '2010.02.26' AS DATE1, 3   AS NUMBER1, NULL AS AMT1, 20    AS AMT2, '비고7' AS NOTES FROM DUAL UNION ALL
       
SELECT '차량유지비' AS NAME, '2010.03.15' AS DATE1, 50  AS NUMBER1, 100  AS AMT1, NULL  AS AMT2, '비고8' AS NOTES FROM DUAL 
    )

     SELECT DECODE(A.GUBUN, 0, A.NAME, 1, A.NAME || ' 계', 3, '총계')   AS "계정명"
          , A.DATE1  AS "전표일자"
          , A.NOTES
          , 
DECODE(A.GUBUN, 0, A.NUMBER1, 1, NULL)                      AS "일련번호"
          , 
DECODE(A.GUBUN, 0, A.AMT1, 1, A.AMT1 - A.AMT2, 3, AMT1)     AS "차변금액"
          , 
DECODE(A.GUBUN, 0, A.AMT2, 1, NULL, 3, AMT2)                AS "대변금액"
          , GUBUN
       
FROM (
             
SELECT A.NAME
                  , A.DATE1
                  , A.NOTES
                  , 
MIN(A.NUMBER1)   AS NUMBER1
                  , 
SUM(AMT1)    AS AMT1
                  , 
SUM(AMT2)    AS AMT2
                  , 
GROUPING_ID(A.NAME, A.DATE1) AS GUBUN
               
FROM DATA1 A
              
GROUP BY ROLLUP(a.name, (a.date1, a.number1, a.notes))
             ) A ; 


 
 

 

 

'(DB) Oracle > SQL.통계-통계함수' 카테고리의 다른 글

Oracle - ROLLUP예제1  (0) 2017.01.21
Oracle - RANK()  (0) 2017.01.21
Oracle - RANK()  (0) 2017.01.21
Oracle - LAG.LEAD()  (0) 2017.01.21
Oracle - GROUPING / GROUPING_ID  (0) 2017.01.21
Posted by 농부지기
,

[ Oracle - GROUPING / GROUPING_ID ]

 

 

☞ GROUPING_ID

 

정의 : GROUPING_ID함수는 행과 관련되는 GROUPING 비트 벡터에 대응되는 수치를 반환.
       GROUPING_ID함수는 행과 관련된 GROUPING 비트 벡터에 대응하는 수치를 반환한다. 
        GROUPING_ID는 ROLLUP,CUBE,GROUPING함수와 같은 GROUP BY 확장 기능을 포함한 SELECT문장에서
       적용할수 있다. 많은 GROUP BY 표현을 가지는 쿼리에서,많은 GROUPING함수를 필요로 하는 
       특정한 행의 GROUP BY 레벨을 지정하기 위해서는 복장한 SQL이 요구된다. 
       GROUPING_ID는 이런 경우 유용하다.

       GROUPING_ID함수는 다수의 GROUPING함수의 결과와 비트 벡터(1과 0의 문자열)를 연결하는 것과
       동일하다. GROUPING_ID를 이용하여서 다수의 GROUPING함수를 사용하지 않고서,
       표현하기 위한 행의 필터 조건이 간단해진다. 행 필터링은 원하는 행이 GROUPING_ID=n의 
       단일 조건으로 정의 될수 있어서 더 쉬워진다. 
       함수는 단일 테이블에서 다수의 집계의 레벨을 저장할때 유용하다.

SQL 예 : SELECT channel_id, promo_id, sum(amount_sold) s_sales  
               , 
GROUPING(channel_id) gc
              , 
GROUPING(promo_id) gp
              , 
GROUPING_ID(channel_id, promo_id) gcp
              , 
GROUPING_ID(promo_id, channel_id) gpc 
         
FROM   sales 
         
WHERE  promo_id > 496 
         
GROUP BY CUBE(channel_id, promo_id) ;  

결과)

    
C  PROMO_ID      S_SALES       GC         GP        GCP       GPC 
    - ----------   ---------- ---------- ---------- ---------- ---------- 
    C        497     26094.35       0         0         0         0 
    C        498      22272.4       0         0         0         0 
    C        499      19616.8       0         0         0         0 
    C       9999     87781668       0         0         0         0 
    C              87849651.6       0        
 1         1         2 
    I        497      50325.8       0         0         0         0 
    I        498      52215.4       0         0         0         0 
    I        499     58445.85       0         0         0         0 
    I       9999    169497409       0         0         0         0 
    I               169658396       0         
1         1         2 
    P        497     31141.75       0         0         0         0 
    P        498      46942.8       0         0         0         0 
    P        499        24156       0         0         0         0 
    P       9999     70890248       0         0         0         0 
    P              70992488.6       0         
1         1         2 
    S        497    110629.75       0         0         0         0 
    S        498     82937.25       0         0         0         0 
    S        499     80999.15       0         0         0         0 
    S               267480357       0         
1         1         2 
    T        497       8319.6       0         0         0         0 
    T        498      5347.65       0         0         0         0 
    T        499        19781       0         0         0         0 
    T       9999     28095689       0         0         0         0 
    T              28129137.3       0         
1         1         2 
             497    226511.25       
        0         2         1 
             498     209715.5       
1         0         2         1 
             499     202998.8       
1         0         2         1 
             9999    623470805       
1         0         2         1 
                     624110031       
1         1         3         
3 

설명)
   1. 
GROUPING(channel_id) gc
         : 0 -> channel_id가 Record에 나오는 ROW는 0
                즉, CUBE, ROLL_UP 후 해당 컬럼별로 SUM한 결과가 나오는 ROW는 0
           1 -> channel_id가 Record에 나오지 않는 ROW는 1

                즉, CUBE, ROLL_UP 후 총 SUM한 결과가 나오는 ROW는 1


   2. 
GROUPING_ID(channel_id, promo_id) gcp
         : 0 -> channel_id, promo_id 가 Record에 나오는 ROW는 0

           1 -> channel_id는 존재하고, promo_id는 미존재하는 Record일 경우 ROW는 1

           2 -> channel_id는 미존재하고, promo_id는 존재하는 Record일 경우 ROW는 2

           .... 

 


 
 

 

'(DB) Oracle > SQL.통계-통계함수' 카테고리의 다른 글

Oracle - ROLLUP예제1  (0) 2017.01.21
Oracle - RANK()  (0) 2017.01.21
Oracle - RANK()  (0) 2017.01.21
Oracle - LAG.LEAD()  (0) 2017.01.21
Oracle - ROLLUP  (0) 2017.01.21
Posted by 농부지기
,