안녕하세요 현재 통계치를 짜고있는데 어려움이있어 질문드립니다. ㅠ
SELECT DATE_FORMAT(DCB_YMD, '%Y') DCB_YMD ,'' AS STATE_DT2 ,COUNT(CASE WHEN DTL_STATE_GBN = '02' THEN DTL_STATE_NM END) AS STATE_SUM_DT2 FROM TB_BUSINESS_STATUS_TEMP WHERE DATE_FORMAT(DCB_YMD, '%Y') <= DATE_FORMAT(NOW(), '%Y')-1 GROUP BY DATE_FORMAT(DCB_YMD, '%Y')
조회시
DCB_YMD STATE_DT2 , STATE_SUM_DT2
1974 1
1976 1
1977 1
1981 3
1982 9
1983 19
1984 16
1985 49
1986 93
1987 111
1988 381
1989 944
1990 1452
1991 3937
1992 3274
1993 6255
1994 10602
1995 11355
1996 12984
1997 18073
1998 20711
1999 28603
2000 33367
2001 36759
2002 54209
2003 52893
2004 58340
2005 65460
2006 58457
2007 52107
2008 49542
2009 47353
2010 46580
2011 47878
2012 43862
2013 46827
2014 43375
2015 47443
2016 48806
2017 53755
2018 56957
2019 55550
2020 51503
2021 53239
위의 보여주고있는데 이데이터를 4년치 데이터의 총합계를 보여주고싶습니다.
1974~2019 총합
1974~2020 총합
1974~2021 총합
--------------------------------
2018 1062844
2019 1118394
2020 1169897
2021 1223136
이데이터를 뽑아내고싶습니다.
답변부탁드립니다. 감사합니다.
두가지로 해보았습니다.
with t (dcb_ymd, state_sum_dt2) as ( select '1974',1 union all ... select '2020',51503 union all select '2021',53239 ) select * from( select dcb_ymd, sum(state_sum_dt2) over(order by dcb_ymd) from t ) tmp where dcb_ymd >= 2018
select * from( select t1.dcb_ymd, sum(t2.state_sum_dt2) from t t1, t t2 where t2.dcb_ymd <= t1.dcb_ymd group by t1.dcb_ymd ) tmp where dcb_ymd >= 2018
1. 컬럼 가공 조건 개선
- 변경전 : 컬럼을 가공하여 조건 비교
- 변경후 : 컬럼은 그대로 두고 조건을 가공하여 비교
2. 불필요 case 제거
- case 조건을 Where 절로 내림
3. 누적합
- 분석함수 over 이용
SELECT * FROM (SELECT DATE_FORMAT(dcb_ymd, '%Y') dcb_ymd , SUM(COUNT(*)) OVER(ORDER BY DATE_FORMAT(dcb_ymd, '%Y')) state_sum_dt2 FROM tb_business_status_temp WHERE dcb_ymd < CONCAT(DATE_FORMAT(NOW(), '%Y'), '-01-01') AND dtl_state_gbn = '02' GROUP BY DATE_FORMAT(dcb_ymd, '%Y') ) a WHERE dcb_ymd >= DATE_FORMAT(NOW(), '%Y') - 4 ;