쿼리 좀 봐주세요 0 5 545

by queseraser [SQL Query] [2020.03.09 20:40:56]


with t1 as(

select 'aa' as empno, 1 as seqno, '1111' as id1, '2222' as id2, '3333' as id3 from dual

union all

select 'aa' as empno, 2 as seqno, 'a111' as id1, '' as id2, '' as id3 from dual

union all

select 'bb' as empno, 1 as seqno, 'b123' as id1, 'c124' as id2, '' as id3 from dual

union all

select 'bb' as empno, 2 as seqno, '' as id1, '' as id2, '' as id3 from dual

)

select z.emp_no, z.seqno, decode(z.id1, null 'N', 'Y'), decode(z.id2, null 'N', 'Y'), decode(z.id3, null 'N', 'Y'), (s1+s2+s3) tot_sum

  from (

          select emp_no, seqno, id1, id2, id3

                , sum(decode(id1, null, 0,1) ) over (partition by emp_no, seqno) as s1

                , sum(decode(id2, null, 0,1) ) over (partition by emp_no, seqno) as s2

                , sum(decode(id3, null, 0,1) ) over (partition by emp_no, seqno) as s3   

           from t1

) z

id1,2,3 각각의 합을 구하는 쿼리를 작성했는데요

좀 더 간단하게 구할 수 있을까요?

 

결과를 아래와 같이 나오게 하려고 합니다.

 

empno seqno id1 id2 id3 sum
aa 1 Y Y Y 3
aa 2 Y N N 1
bb 1 Y Y N 2
bb 2 N N N 0

 

by 마농 [2020.03.09 23:11:36]

집계기준이 유일키이므로 집계함수나 분석함수 사용이 불필요해 보입니다.


by queseraser [2020.03.10 07:10:09]

집계합수나 분석함수를 사용하지 않는 방법을 모르겠네요 ㅠ


by 마농 [2020.03.10 09:18:17]

sum() over() 부분만 빼면 됩니다.


by 마농 [2020.03.10 07:56:14]
WITH t1 AS
(
SELECT 'aa' empno, 1 seqno, '1111' id1, '2222' id2, '3333' id3 FROM dual
UNION ALL SELECT 'aa', 2, 'a111', ''    , '' FROM dual
UNION ALL SELECT 'bb', 1, 'b123', 'c124', '' FROM dual
UNION ALL SELECT 'bb', 2, ''    , ''    , '' FROM dual
)
SELECT empno, seqno
     , id1, id2, id3
     , NVL2(id1, 'Y', 'N') yn1
     , NVL2(id2, 'Y', 'N') yn2
     , NVL2(id3, 'Y', 'N') yn3
     , NVL2(id1, 1, 0)
     + NVL2(id2, 1, 0)
     + NVL2(id3, 1, 0) s
     , DECODE('', id1, 0, id2, 1, id3, 2, 3) s -- 항상 순서대로 채워진다면?
  FROM t1
 ORDER BY empno, seqno
;

 


by queseraser [2020.03.10 09:14:50]

아..감사합니다~

한줄로 해결이 되네요

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입