서로 다른 로우 비교 카운트 질문입니다. 0 8 2,407

by wenzie [SQL Query] [2013.05.12 21:18:16]



안녕하세요~~

통계 쿼리를 하는데요 질문입니다.


데이터는 아래와 같습니다.

gbn mem_no service_no service_date  service_area
01 1111 1 20130101 aaa
01 2222 2 20121201 bbb
02 2222 1 20130111 bbb
03 3333 3 20130304 aaa
04 1111 1 20130121 aaa
01 3333 3 20130101 aaa
03 4444 4 20130201 ccc
04 2222 2 20130121 bbb

이렇게 있는데요

제가 뽑고 싶은 데이터는 년월을 파라미터로 넘겨서

gbn이 01 과04인 회원중 년도가 같은 회원의 수를 구하고 싶습니다.

검색 조건은 시작일과 종료일 입니다.

검색조건을 201211 ~ 201301로 준다면
01 1111 1 20130101
01 2222 2 20121201
04 1111 1 20130121
04 2222 2 20130121

이렇게 나오는데요

여기서 회원별로 gbn 01의 service_date와 04의 service_date의 년도가 같아야 합니다.

그래서 카운트를 하면 1이 나와야 합니다. 2222 회원은 년도가 같지 않기때문에 카운트에서 빠지게 됩니다.

지역별,gbn별로 카운트는 뽑았는데요 요번건은 어렵네요..ㅜㅜ







by 아발란체 [2013.05.13 08:57:58]

이렇게 하면 나오는데요... 까지는 이해를 했는데
카운트를 하면 1이 되는지는... 이해하기 어렵네요.

년도가 같이 않기 때문에 빠지는 것은 01/2222/2/20121201, 1건인 것 같은데
그럼 3건 남는데..... 그럼 2222가 1건  빠지므로 같은 2222도 빼면
2건 남는데... 어떤 기준으로 남은 것 2건이 합쳐서 1이 되는지용.

그리고 지역별, GBN별 카운트는 뽑았다고 하시는데.. 요번건?? 이라는 항목은 무엇인지용.


by wenzie [2013.05.13 11:55:54]
한회원이 01,04 년도가 같으면 카운트 1 올리는 겁니다..^^ 04가 여러건이더라도 카운트는 1입니다.

gbn 01은 무조건 1건 04는 여러건이 될수 있습니다.

요번건이라는건  현재 제가 질문한걸 말하는겁니다..^^

by 장비 [2013.05.13 10:31:20]
with t (gbn, mem_no, service_no, service_date, service_area ) as (
     select '01', '1111', '1', '20130101', 'aaa' from dual
union all select '01', '2222', '2', '20121201', 'bbb' from dual 
union all select '02', '2222', '1', '20130111', 'bbb' from dual
union all select '03', '3333', '3', '20130304', 'aaa' from dual
union all select '04', '1111', '1', '20130121', 'aaa' from dual
union all select '01', '3333', '3', '20130101', 'aaa' from dual
union all select '03', '4444', '4', '20130201', 'ccc' from dual
union all select '04', '2222', '2', '20130121', 'bbb' from dual
)
select gbn
   , count(1) 
 from t
 where gbn in ('01', '04')
  and service_date between '201211'||'01' and '201301'||'31'
  and exists ( select null
         from t a
         where a.mem_no = t.mem_no
          and a.gbn != t.gbn
          and substr(a.service_date,1,4) = substr(t.service_date,1,4)
        )  
 group by gbn        
 order by gbn

by 장비 [2013.05.13 10:49:29]

줄이 안맞네요 ㅠ ; ; 
다른 로우랑 비교할려면 테이블을 한번 더 조회해와요 되요 . 셀프조인도 가능하겠네요 .
경우에 따라서 분석함수를 쓸수도 있지만. .

by 마농 [2013.05.13 11:02:21]
하나의 구분 안에서 한명의 회원이 연도를 달리하거나 날짜를 달리하여 두건이상 존재할수 있는지요?
  - 존재한다 VS 안한다
존재할 경우...
만약 9999 라는 회원이 구분01에는 2013년만 있고 구분04에는 2012년,2013년 두건 존재한다면?
9999 회원은 카운트 되어야 하나요? 안되어야 하나요?
  - 2013년이 같으므로 존재해야 한다 VS 2012년이 다르므로 제외되어야 한다?
제외되어야 할 경우...
그렇다면 01에도 12년,13년이 있고 04에도 12년,13년이 있다면?
  - 이건 제외되어야 하는건지 카운트 되어야 하는건지?

by wenzie [2013.05.13 11:48:20]
하나의 구분 안에서 한명의 회원이 연도를 달리하거나 날짜를 달리하여 두건이상 존재할수 있는지요?
네 존재 합니다. 하지만 구분 01은 무조건 1개구요 구분 04가 여러개 나올수도 있습니다.
구분 04가 여러개라고 하더라도 그 회원의 카운트는 1이 나와야 합니다.

만약 9999 라는 회원이 구분01에는 2013년만 있고 구분04에는 2012년,2013년 두건 존재한다면?
9999 회원은 카운트 되어야 하나요? 안되어야 하나요?
카운트 되어야 합니다.2013년이 일치하기 때문입니다.


아오 설명을 너무 못하네요..ㅜㅜ

by 마농 [2013.05.13 13:06:31]
SELECT COUNT(MIN(0)) cnt
  FROM t
 WHERE service_date >= '201211'||'01'
   AND service_date <= '201301'||'31'
   AND gbn IN ('01', '04')
 GROUP BY mem_no, SUBSTR(service_date, 1, 4)
HAVING COUNT(DISTINCT gbn) = 2
;

by wenzie [2013.05.14 16:36:34]
답변감사합니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입