안녕하세요
쿼리 부탁드립니다
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;
감사합니다.
그런데 꼭 테이블을 두번 읽는 방법밖에는 없을까요?
제 능력밖입니다. ^^
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 를 이용해 보세요.
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
;
or 연산자를 사용하는거 보다 이 방법이 더 효율적으로 보여지네요.
항상 더 고민해보는 습관이 필요할듯 합니다.
BB, CC 기준으로 AA가 NULL이 아닌 경우는 1개만 존재한다면 아래처럼 간단히 가능할듯 합니다.
WITH T AS ( SELECT null aa, 4 bb, 5 cc FROM dual UNION ALL SELECT 'sd', 4, 5 FROM dual UNION ALL SELECT null, 4, 7 FROM dual UNION ALL SELECT null, 6, 3 FROM dual ) SELECT MAX(AA) AA, BB, CC FROM T GROUP BY BB, CC ;