'소계'에 해당되는 글 7

  1. 2011.06.14 오라클 rollup, partition을 이용한 소계,합계 내보기
[쥔장] =================================
나름 유용한 쿼리이다. 잘 활용해보길..
========================================

select
       decode(row_number() over(partition by proc_date order by user_no), 1, proc_date, ' ') proc_date,
       nvl(decode(grouping_id(proc_date, user_no), 1, '소계', user_no), '합계') user_no,
       sum(decode(terminal_type, '1', 1, 0)) machine_data,
       sum(decode(terminal_type, '2', 1, 0)) localpc_data
  from user_terminal_use_list
 where 1=1
--   and dlns_dt between '20110501' and '20110515'
--   and dlns_dt between '20110516' and '20110529'
--   and dlns_dt between '20110530' and '20110531'
   and status_type = '0'
 group by rollup(proc_date, user_no)         
 order by proc_date, user_no
;

여기서 포인트를 보자면..
1) decode(row_number() over(partition by proc_date order by user_no), 1, proc_date, ' ') proc_date 와
2) group by rollup(proc_date, user_no) 이다.

1) 은 user_no에 의한 proc_date를 뽑아내는 것.
    row_number() : 무조건 순서대로 순번을 뽑아낸다.
    over (partition by proc_date...) proc_date 기준으로 분류를 해서...
    즉, proc_date 기준으로 분류를 하는데 무조건 순번을 뽑아내고, proc_date 기준으로 순번이 1이라면 proc_date 값을 넣고, 아니면 빈값을 넣어주라...
2) 는 proc_date, user_no 에 의한 그룹화시켜 이에 대응되는 데이터의 합을 내준다.


결과는...
proc_date user_no machine_date localpc_data
20110302 100 1 2
  101 0 2
  102 0 6
  103 0 4
  104 0 24
  105 0 3
  106 0 5
  107 0 6
  소계 1 52
20110303 100 0 39
  101 1 37
  102 0 88
  104 7 32
  105 20 16
  106 0 15
  107 0 17
  소계 28 224
  합계 29 276

이와 같은 형태로 나온다.