Sql 쿼리 문의드려요 0 7 6,903

by sm5 [Oracle 기초] [2025.03.01 20:17:46]


안녕하세요

쿼리 부탁드립니다

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

부탁드립니다.

감사합니디.

 

 

by 김하진 [2025.03.02 10:44:16]

안녕하세요. 이렇게 해 보시지요?  (오라클 기준)

 

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;

 


by sm5 [2025.03.03 19:48:30]

감사합니다.

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


by 김하진 [2025.03.04 12:06:16]

제 능력밖입니다. ^^


by 우주민 [2025.03.04 14:23:19]
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

 


by 마농 [2025.03.06 01:15:58]

널인 행과 아닌 행이 각각 한건씩만 존재할까요?
아니면 여러건 존재가 가능할까요?
여러건 존재한다면? 어떤 결과가 나와야 할까요?
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
;

 


by 우주민 [2025.03.06 13:04:45]

or 연산자를 사용하는거 보다 이 방법이 더 효율적으로 보여지네요.

항상 더 고민해보는 습관이 필요할듯 합니다.


by 창조의날개 [2025.03.06 17:15:11]

BB, CC 기준으로 AA가 NULL이 아닌 경우는 1개만 존재한다면 아래처럼 간단히 가능할듯 합니다.

1
2
3
4
5
6
7
8
9
10
11
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
;

 

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