안녕하세요. 테이블을 두 번 읽어야 하지만 ( 읽을 수 밖에 없지만 ) ... 이렇게 해 보시지요? (오라클 기준입니다)
WITH t AS (
SELECT 4 aa, 375 bb, 678 cc FROM dual UNION ALL
SELECT 4, to_number(NULL), to_number(NULL) FROM dual UNION ALL
SELECT 5, to_number(NULL), to_number(NULL) FROM dual
)
SELECT aa, bb, cc, NVL(dd, 'N') dd
FROM (
SELECT aa, bb, cc,
(SELECT 'Y'
FROM dual
WHERE EXISTS (SELECT 1 FROM t b
WHERE a.aa = b.aa
AND (b.bb IS NOT NULL OR b.cc IS NOT NULL)
)
) dd
FROM t a
)
ORDER BY aa, bb, cc;
감사합니다.
그런데 꼭 테이블을 두번 읽는 방법밖에는 없을까요?
제 능력밖입니다. ^^
AA그룹 5에 BB or CC가 NULL이 아닐땐 어떤 결과가 나와야 하나요?
-- MSSQL 기준 WITH DT AS ( SELECT 4 AA, 123 BB, 456 CC UNION ALL SELECT 4, NULL, NULL UNION ALL SELECT 5, NULL, NULL UNION ALL SELECT 6, 123, NULL UNION ALL SELECT 7, NULL, 456 ) SELECT AA , BB , CC , (CASE WHEN SUM(BB) OVER(PARTITION BY AA) IS NOT NULL OR SUM(CC) OVER(PARTITION BY AA) IS NOT NULL THEN 'Y' ELSE 'N' END) AS DD FROM DT
with tmp as (
select 4 as AA, 1112 as BB, 1111 as CC from dual union all
select 4 as AA, null as BB, null as CC from dual union all
select 5 as AA, null as BB, null as CC from dual
)
select AA, BB, CC
, case when m_bb is not null or m_cc is not null then 'Y' else 'N' end as DD
from (select AA, BB, CC
, max(BB) over(partition by AA) as m_bb
, max(CC) over(partition by AA) as m_cc
from tmp) t
WITH t AS
(
SELECT 4 aa, 375 bb, 678 cc FROM dual
UNION ALL SELECT 4, null, null FROM dual
UNION ALL SELECT 5, null, null FROM dual
)
SELECT aa, bb, cc
, DECODE(COUNT(bb||cc) OVER(PARTITION BY aa), 0, 'N', 'Y') dd
FROM t
;
와... null 과 연산자의 특성을 이용한 방법은 생각도 못해봤네요.