데이터 중 쌍으로 존재하는 데이터를 추출하고 싶습니다. 0 4 3,203

by 짱구 [SQL Query] oracle group [2021.05.18 20:34:55]


죄송하게 또 여쭈어보게 되네요.

아래의 코드는 필드 C, D를 공통으로 가지는 A, B 필드에 값의 쌍의 값을 찾고 싶습니다.

* 공통으로 가지는 필드는 C, D필드 말고도 더 많은 필드로 늘어날 수 있습니다. 또한 쌍으로 되는 값도 A, B 말고 더 많은 필드 구성으로 늘어 날 수 있습니다.

WITH t AS
(
          select 'A' as a, '가' as b, '14' as c, '57' as d, 1 as e from dual
union all select 'B','나','14','05',2 from dual
union all select 'B','다','13','88',3 from dual
union all select 'A','라','13','93',4 from dual
union all select 'A','마','14','11',5 from dual
union all select 'C','바','14','85',6 from dual
union all select 'B','사','14','05',7 from dual
union all select 'A','아','14','40',8 from dual
union all select 'A','자','14','77',9 from dual
union all select 'A','차','14','03',10 from dual
union all select 'A','카','14','77',11 from dual
union all select 'A','타','14','72',12 from dual
union all select 'C','파','13','67',13 from dual
union all select 'A','하','13','13',14 from dual
)
SELECT a, b, c, d, e
  FROM (SELECT a, b, c, d, e
             , COUNT(*) OVER(PARTITION BY c, d, rn) cnt
          FROM (SELECT a, b, c, d, e
                     , ROW_NUMBER() OVER(PARTITION BY c, d, a, b ORDER BY e) rn
                  FROM t
                 WHERE (a = 'A' OR b = '켁')
                )
        )
 WHERE cnt = 2
 ORDER BY e
;

위와 같이 OR조건이지만 B필드에 '켁' 문자가 없으므로 0건 나올줄 알았는데

A	B	C	D	E
===================
A	자	14	77	9
A	카	14	77	11

우와 같이 결과가 나오네요.

정상적으론.

1. WHERE (a = 'A' OR b = '카')

2. WHERE (a = 'A' OR b = '자')

일 때만 아래와 같이 결과가 나오고 싶었거든요.

A	B	C	D	E
===================
A	자	14	77	9
A	카	14	77	11

염치 없이 한번 더 부탁드립니다.

감사합니다.

by 마농 [2021.05.20 08:41:06]

기존 질문과는 예시자료의 형태가 다르네요. http://gurubee.net/article/84359
- ('A', '') 과 ('', '켁') 형태로 한쪽 항목만 채워져 있었고
- 또한 기준이 되는 항목(a)에 대한 자료가 여러건이 있었습니다.
이번 질문엔
- 양쪽 항목이 모두 채워져 있네요?
- 기준이 되는 항목(c,d)에 대한 자료가 2건 이하 뿐인지?(예시 기준)
- 아니면 더 많을 수 있는지?
- 또한 a,b 말고 항목이 더 있다는데?
- 지금 예시와 설명만으로는 정확한 요구사항 파악이 안됩니다.


by 짱구 [2021.05.20 09:42:34]

- ('A', '') 과 ('', '켁') 형태로 한쪽 항목만 채워져 있었고

  : 한쪽만 채워질 수도 있고 양쪽 다 채워질 수도 있습니다.
- 또한 기준이 되는 항목(a)에 대한 자료가 여러건이 있었습니다.

  : a, b 필드에 값은 중복건이 있을수도 있으며 null 또한 존재합니다.

예시)

          select 'A' as a, '가' as b, '14' as c, '57' as d, 1 as e from dual
union all select 'B','가','14','05',2 from dual
union all select 'B','','13','88',3 from dual
union all select '','라','13','93',4 from dual
union all select 'A','나','14','11',5 from dual


이번 질문엔
- 양쪽 항목이 모두 채워져 있네요?

   : 한쪽만 채워질 수도 있고 양쪽 다 채워질 수도 있습니다.
- 기준이 되는 항목(c,d)에 대한 자료가 2건 이하 뿐인지?(예시 기준)

   : 기준이 되는 필드는 프로그램적으론 c, d,... 이렇게 n개가 될 수 있지만, 업무적으론 2개 초과는 없을 것 같습니다.

     공통으로 존재하는 건은 n건이 있습니다. 즉, 여러건입니다.
- 아니면 더 많을 수 있는지?
- 또한 a,b 말고 항목이 더 있다는데?
- 지금 예시와 설명만으로는 정확한 요구사항 파악이 안됩니다.

   : 하고자 하는 일은 

     1. (a, b 필드 또는 a 필드)에서 or조건으로 값을 추출한 후

         : a = 'A' or b = '가'    또는    a = 'A' or a = 'C'  이렇게 식이 존재합니다.

     2. 추출한 값중 c, d가 같으며 a. b조건값을 쌍으로 가지는 row를 추출하고자 합니다.

         - 추출되는 데이터는 짝수 row로만 나옵니다.

         예) a = 'A' or b = '가'

              이렇게 있다면  a =  'A'  1row

                                  b =  '가' 1row

                                  이며, c, d가 공통값을 가져야 합니다.

               이게 쌍으로 n개 있을 수 있습니다.

 

               

              a = 'A' or a = 'C'

              이렇게 있다면  a =  'A'  1row

                                  a =  'C' 1row

                                  이며, c, d가 공통값을 가져야 합니다.

               이게 쌍으로 n개 있을 수 있습니다.


by 짱구 [2021.05.20 10:02:37]

마농님의 답변에서 힌트를 얻어

    : - ('A', '') 과 ('', '켁') 형태로 한쪽 항목만 채워져 있었고

아래와 같이 하니깐 되네요. 예시는...

아래와 같이 해보고 안되면 다시 정리해서 여쭤보겠습니다. 감사합니다.

WITH t AS
(
          select 'A' as a, '가' as b, '14' as c, '57' as d, 1 as e from dual
union all select 'B','나','14','05',2 from dual
union all select 'B','다','13','88',3 from dual
union all select 'A','라','13','93',4 from dual
union all select 'A','마','14','11',5 from dual
union all select 'C','바','14','85',6 from dual
union all select 'B','사','14','05',7 from dual
union all select 'A','아','14','40',8 from dual
union all select 'A','자','14','77',9 from dual
union all select 'A','차','14','03',10 from dual
union all select 'A','카','14','77',11 from dual
union all select 'A','타','14','72',12 from dual
union all select 'C','파','13','67',13 from dual
union all select 'A','하','13','13',14 from dual
)
SELECT a, b, c, d, e
  FROM (SELECT a, b, c, d, e
             , COUNT(*) OVER(PARTITION BY c, d, rn) cnt
          FROM (SELECT a, b, c, d, e
                     , ROW_NUMBER() OVER(PARTITION BY c, d, decode(a, 'A', a, null), decode(b, '켁', b, null) ORDER BY e) rn
                  FROM t
                 WHERE (a = 'A' OR b = '켁')
                )
        )
 WHERE cnt = 2
 ORDER BY e
;

 

WITH t AS
(
          select 'A' as a, '가' as b, '14' as c, '57' as d, 1 as e from dual
union all select 'B','나','14','05',2 from dual
union all select 'B','다','13','88',3 from dual
union all select 'A','라','13','93',4 from dual
union all select 'A','마','14','11',5 from dual
union all select 'C','바','14','85',6 from dual
union all select 'B','사','14','05',7 from dual
union all select 'A','아','14','40',8 from dual
union all select 'A','자','14','77',9 from dual
union all select 'A','차','14','03',10 from dual
union all select 'A','카','14','77',11 from dual
union all select 'A','타','14','72',12 from dual
union all select 'C','파','13','67',13 from dual
union all select 'A','하','13','13',14 from dual
)
SELECT a, b, c, d, e
  FROM (SELECT a, b, c, d, e
             , COUNT(*) OVER(PARTITION BY c, d, rn) cnt
          FROM (SELECT a, b, c, d, e
                     , ROW_NUMBER() OVER(PARTITION BY c, d, decode(a, 'A', a, null), decode(b, '자', b, null) ORDER BY e) rn
                  FROM t
                 WHERE (a = 'A' OR b = '자')
                )
        )
 WHERE cnt = 2
 ORDER BY e
;

by 마농 [2021.05.20 11:31:26]

테스트용 자료가 너무 단순합니다.
복잡하고 난해한 예로 테스트 해보셔야 합니다.

union all select 'A','자','14','77',15 from dual
union all select 'A','카','14','77',16 from dual
union all select 'B','자','14','77',17 from dual
union all select 'B','자','14','77',18 from dual

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