기간별 금액 SUM, 건수 COUNT 문제... 1 3 3,800

by 종이남자 [SQL Query] 기간별 누적 건수 OVER [2014.01.29 13:37:54]


안녕하세요.

기간별 누적을 구하는 부분에서 막힘이 있어 질문드립니다.

with orgz as (
select '조직1' as orgzno, '부가정보1' etc from dual
union all
select '조직2' as orgzno, '부가정보1' etc from dual
)
, emp as (
select '사원1' as empno, '조직1' as orgzno from dual
union all
select '사원2' as empno, '조직1' as orgzno from dual
union all
select '사원3' as empno, '조직2' as orgzno from dual
union all
select '사원4' as empno, '조직2' as orgzno from dual
)
,acrs as (
select '201310' as ym, '사원1' as empno, 100 as amt from dual
union all
select '201311' as ym, '사원1' as empno, 200 as amt from dual
union all
select '201312' as ym, '사원1' as empno, 300 as amt from dual
union all
select '201311' as ym, '사원2' as empno, 400 as amt from dual
union all
select '201312' as ym, '사원3' as empno, 500 as amt from dual
)
,edct as (
select '201310' as ym, '사원1' as empno, '과정1' as crs from dual
union all
select '201310' as ym, '사원1' as empno, '과정2' as crs from dual
union all
select '201311' as ym, '사원1' as empno, '과정3' as crs from dual
union all
select '201312' as ym, '사원2' as empno, '과정1' as crs from dual
)

201312월 집계
조직   부가정보   사원   당월실적  전월누적실적  과정1수료횟수
조직1  부가정보1  사원1  300       300           1
조직1  부가정보1  사원2  0         400           0
조직2  부가정보2  사원3  500       0             1

년월을 입력받아서 위처럼 집계할수 있는방법이 있을까요...
이것 말고도 부가정보가 덕지덕지 붙어야되서 group by를 안쓰고 하고싶은데.. 가능한가요?

이렇게 기간별로 있는 데이터를 당월, 전월 누적, 특정 년월구간별로 옆으로 나열하는 방법이 뭐가 있나요?
by 마농 [2014.01.29 16:00:36]
-- (1:다:다) 관계는 자칫 잘못 조인 하면 카티션곱이 발생됩니다.
-- (다)의 집합을 우선 (1)로 만든 후, (1:1:1) 로 조인하시는게 좋습니다.
SELECT a.orgzno
     , a.etc
     , a.empno
     , NVL(b.amt_1, 0) amt_1
     , NVL(b.amt_2, 0) amt_2
     , NVL(c.crs_1, 0) crs_1
     , NVL(c.crs_2, 0) crs_2
     , NVL(c.crs_3, 0) crs_3
  FROM (SELECT o.orgzno
             , o.etc
             , e.empno
          FROM emp  e
             , orgz o
         WHERE e.orgzno = o.orgzno
        ) a
     , (SELECT empno
             , SUM(CASE WHEN ym = '201312' THEN amt END) amt_1
             , SUM(CASE WHEN ym < '201312' THEN amt END) amt_2
          FROM acrs
         GROUP BY empno
        ) b
     , (SELECT empno
             , COUNT(CASE WHEN crs = '과정1' THEN 1 END) crs_1
             , COUNT(CASE WHEN crs = '과정2' THEN 1 END) crs_2
             , COUNT(CASE WHEN crs = '과정3' THEN 1 END) crs_3
          FROM edct
         GROUP BY empno
        ) c
 WHERE a.empno = b.empno(+)
   AND a.empno = c.empno(+)
   AND NVL(b.empno, c.empno) IS NOT NULL
 ORDER BY a.orgzno, a.empno
;

by 종이남자 [2014.01.29 16:19:14]
와.... 정말 감사합니다!!
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입