Sql 생각이 안나서요 0 8 6,913

by sm5 [SQL Query] [2025.03.01 20:01:08]


안녕하세요.

AA       BB         CC

4          375       678

4          null        null 

5          null         null

‐-------------------------------------

위의 테이블에서요.

AA칼럼 걊이 동일한 그룹 4 중에 BB또는 CC칼럼에 값이 존재하는 row가 존재하면  아래와같이 동일4구룹에 칼럼 DD에 Y라고 넣고 싶습니다.

결과.

AA       BB         CC        DD

4          375       678        Y

4          null        null        Y

5          null        null        N

 

가능할까요?

부탁드려요 종일생각해도 답이 안나오네요

by 김하진 [2025.03.02 10:33:27]

안녕하세요. 테이블을 두 번 읽어야 하지만 ( 읽을 수 밖에 없지만 ) ...  이렇게 해 보시지요? (오라클 기준입니다)

 

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;
 

 


by sm5 [2025.03.03 19:48:50]

감사합니다.

그런데 꼭 테이블을 두번 읽는 방법밖에는 없을까요?


by 김하진 [2025.03.04 12:05:56]

제 능력밖입니다. ^^


by Hinori_ [2025.03.04 09:37:33]

AA그룹 5에 BB or CC가 NULL이 아닐땐 어떤 결과가 나와야 하나요?


by Hinori_ [2025.03.04 16:10:20]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- 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

 


by 우주민 [2025.03.04 14:30:25]
1
2
3
4
5
6
7
8
9
10
11
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

 


by 마농 [2025.03.06 01:04:18]
1
2
3
4
5
6
7
8
9
10
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
;

 


by 우주민 [2025.03.06 13:03:34]

와... null 과 연산자의 특성을 이용한 방법은 생각도 못해봤네요.

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