SQL

누적(누계)

에어팟맥스 2022. 7. 7. 17:39

----- ***** !!!!! 누적(누계)에 대해서 알아보기 !!!!! ***** -----

 

 sum(누적되어야할 컬럼명) over(order by 누적되어질 기준이 되는 컬럼명 asc[desc] )
        
        sum(누적되어야할 컬럼명) over(partition by 그룹화 되어질 컬럼명 
                                   order by 누적되어질 기준이 되는 컬럼명 asc[desc] )

 


  --- *** tbl_panmae 테이블에서 '새우깡'에 대한 일별판매량과 일별누적판매량을 나타내기 *** ---
   

select to_char(panmaedate, 'yyyy-mm-dd') AS 판매일자
         , sum(panmaesu) AS 일별판매량
         , sum( sum(panmaesu) ) over( order by to_char(panmaedate, 'yyyy-mm-dd') ) AS 일별누적판매량
    from tbl_panmae
    where jepumname = '새우깡'
    group by to_char(panmaedate, 'yyyy-mm-dd');
    
    /*
         --------------------------------------
         판매일자       일별판매량    일별누적판매량
         --------------------------------------
         2022-05-06      10            10
         2022-05-07      15            25
         2022-05-09      13            38
         2022-06-07       8            46
         2022-07-06      30            76
    */

 

 

--- *** tbl_panmae 테이블에서 '모든제품'에 대한 일별판매량과 일별누적판매량을 나타내기 *** ---

select jepumname
         , to_char(panmaedate, 'yyyy-mm-dd') AS 판매일자
         , sum(panmaesu) AS 일별판매량
         , sum( sum(panmaesu) ) over(partition by jepumname 
                                      order by to_char(panmaedate, 'yyyy-mm-dd') ) AS 일별누적판매량
    from tbl_panmae
    group by jepumname, to_char(panmaedate, 'yyyy-mm-dd');
    
    /*
        --------------------------------------------------
          제품명     판매일자       일별판매량    일별누적판매량
         -------------------------------------------------
          감자깡   2022-05-08	         20	           20
           ...       ...            ...           ...
          새우깡   2022-05-06         10            10
          새우깡   2022-05-07         15            25
          새우깡   2022-05-09         13            38
          새우깡   2022-06-07          8            46
          새우깡   2022-07-06         30            76
          
          -------------------------------------------------
    
    */

 

stored view를 생성해서 감자깡과 새우깡 구하기

create or replace view view_panmae
    as
    select jepumname
         , to_char(panmaedate, 'yyyy-mm-dd') AS 판매일자
         , sum(panmaesu) AS 일별판매량
         , sum( sum(panmaesu) ) over(partition by jepumname 제품명
                                      order by to_char(panmaedate, 'yyyy-mm-dd') ) AS 일별누적판매량
    from tbl_panmae
    group by jepumname, to_char(panmaedate, 'yyyy-mm-dd');
    -- View VIEW_PANMAE이(가) 생성되었습니다.
    
    
    
    select *
    from view_panmae;
    
    select *
    from view_panmae
    where 제품명 in ('감자깡', '새우깡');

 

 


 --- *** [퀴즈] tbl_panmae 테이블에서 판매일자가 1개월전 '01'일(즉, 현재가 2022-07-06 이므로 2022-06-01 ) 부터 
    ---           현재까지 판매된 모든 제품에 대해 일별판매량과 일별누적판매량을 나타내기 *** ---
    

-- 1개월 전 '01'일 구하는 두가지 방법

select last_day(add_months(sysdate, -2)) +1
          , to_char(last_day(add_months(sysdate, -2)) +1, 'yyyy-mm-dd hh24:mi:ss')
    from dual;
    -- 22/06/01	2022-06-01 15:34:53
    
    select to_date(to_char(add_months(sysdate, -1), 'yyyy-mm-')||'01', 'yyyy-mm-dd')
         , to_char(to_date(to_char(add_months(sysdate, -1), 'yyyy-mm-')||'01', 'yyyy-mm-dd'), 'yyyy-mm-dd hh24:mi:ss')
    from dual;
    -- 22/06/01	2022-06-01 00:00:00
-- [첫번째 방법]
select jepumname
         , to_char(panmaedate, 'yyyy-mm-dd') AS 판매일자
         , sum(panmaesu) AS 일별판매량
         , sum( sum(panmaesu) ) over(partition by jepumname 
                                      order by to_char(panmaedate, 'yyyy-mm-dd') ) AS 일별누적판매량
    from tbl_panmae
    where panmaedate > '2022-06-01'
    group by jepumname, to_char(panmaedate, 'yyyy-mm-dd');
    

-- [두번째 방법]
    select jepumname 제품명
         , to_char(panmaedate, 'yyyy-mm-dd') AS 판매일자
         , sum(panmaesu) AS 일별판매량
         , sum( sum(panmaesu) ) over(partition by jepumname 
                                      order by to_char(panmaedate, 'yyyy-mm-dd') ) AS 일별누적판매량
    from tbl_panmae
    where panmaedate >= to_date(to_char(add_months(sysdate, -1), 'yyyy-mm-') || '01', 'yyyy-mm-dd')
    group by jepumname, to_char(panmaedate, 'yyyy-mm-dd');

------- ==== **** [퀴즈] 아래처럼 나오게 만들기 **** ==== -------
    
    
    ---------------------------------------------
    전체사원수  10대  20대  30대  40대  50대  60대 
    ---------------------------------------------
      107      16   19    21    21   16   14
    ---------------------------------------------

    select count(age_line) 전체사원수
         , sum( decode( age_line, 10, 1 ) ) AS "10대"
         , sum( decode( age_line, 20, 1 ) ) AS "20대"
         , sum( decode( age_line, 30, 1 ) ) AS "30대"
         , sum( decode( age_line, 40, 1 ) ) AS "40대"
         , sum( decode( age_line, 50, 1 ) ) AS "50대"
         , sum( decode( age_line, 60, 1 ) ) AS "60대"
    from
    (
    select trunc(extract(year from sysdate) - to_number( substr(jubun, 1, 2)+ case when substr(jubun,7,1) in ('1','2') then 1900 else 2000 end) +1 , -1) AS age_line
    from employees
    ) V;

------ ==== [퀴즈] 아래처럼 만들기 ==== ------

 --------------------------------------------------------------------------------------------------
       직종ID    남자기본급여평균   여성기본급여평균    기본급여평균    남성급여의평균과의차액 여성급여의평균과의차액
    --------------------------------------------------------------------------------------------------
      .....          ....            ....           .....              ....             ....
    FI_ACCOUNT       7900            7950           7920               -20               30
      IT_PROG        5700            6000           5760               -60              240

 

    select job_id AS 직종ID
         , trunc( avg( decode( gender, '남', salary ) ) ) AS 남자기본급여평균
         , trunc( avg( decode( gender, '여', salary ) ) ) AS 여성기본급여평균
         , trunc( avg( salary ) ) AS 기본급여평균
         , trunc( avg( decode( gender, '남', salary ) ) ) - trunc( avg( salary ) ) AS 남성급여의평균과의차액
         , trunc( avg( decode( gender, '여', salary ) ) ) - trunc( avg( salary ) ) AS 여성급여의평균과의차액
    from 
    (
    select salary, job_id
         , case when substr(jubun, 7, 1) in (2,4) then '여' else '남' end AS GENDER
    from employees
    ) V
    group by job_id
    order by 1;