안녕하세요
쿼리 부탁드립니다
AA BB CC 칼럼
null 4 5
sd 4 5
null 4 7
null 6 3
데이타가 위와 같을때요.
Bb cc 칼럼값이 동일한 데이타중에 aa칼럼이 존재하는 row와 null인 row가 존재하면 null인 row는 출력안되게 하고 동일한 bb cc칼럼 값으로 aa칼럼이 null인 row만 존재하면 출력하고 싶습니다
결과
AA BB CC 칼럼
null 4 5 -------출력x
sd 4 5 --------출력o
null 4 7 ---------출력o
null 6 3 --------출력o
부탁드립니다.
감사합니디.
안녕하세요. 이렇게 해 보시지요? (오라클 기준)
WITH T AS (
SELECT '' AA, 4 BB, 5 CC FROM dual UNION ALL
SELECT 'sd', 4, 5 FROM dual UNION ALL
SELECT '', 4, 7 FROM dual UNION ALL
SELECT '', 6, 3 FROM dual
)
SELECT aa, bb, cc
FROM (
SELECT aa, bb, cc,
(SELECT COUNT(*)
FROM t b
WHERE (a.bb = b.bb AND a.cc = b.cc)
) dd
FROM t a
)
WHERE CASE WHEN dd = 1 THEN 'Y'
ELSE CASE WHEN aa IS NOT NULL THEN 'Y'
ELSE 'N'
END
END = 'Y'
ORDER BY aa, bb, cc;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | with tmp as ( select null as AA, 4 as BB, 5 as CC from dual union all select 'sd' as AA, 4 as BB, 5 as CC from dual union all select null as AA, 4 as BB, 7 as CC from dual union all select null as AA, 6 as BB, 3 as CC from dual ) select AA, BB, CC from ( select AA, BB, CC , count (AA) over(partition by BB, CC) as ct from tmp ) t where ct = 0 or AA is not null |
널인 행과 아닌 행이 각각 한건씩만 존재할까요?
아니면 여러건 존재가 가능할까요?
여러건 존재한다면? 어떤 결과가 나와야 할까요?
1건씩만 가능하다면? rn 을 이용하시고
여러건 가능하다면? rk 를 이용해 보세요.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | WITH t AS ( SELECT null aa, 4 bb, 5 cc FROM dual UNION ALL SELECT 'sd' , 4, 5 FROM dual UNION ALL SELECT 'ai' , 4, 5 FROM dual UNION ALL SELECT null , 4, 7 FROM dual UNION ALL SELECT null , 6, 3 FROM dual ) SELECT aa, bb, cc FROM ( SELECT aa, bb, cc -- , ROW_NUMBER() OVER(PARTITION BY bb, cc ORDER BY aa) rn , RANK() OVER(PARTITION BY bb, cc ORDER BY NVL2(aa, 1, 2)) rk FROM t ) WHERE rk = 1 ; |