database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 38721 게시물 읽기
No. 38721
회비 납부 관련 문의
작성자
강진묵(smooji)
작성일
2011-07-20 17:05ⓒ
2011-07-20 17:58ⓜ
조회수
4,202

오라클 8.0.0.5를 이용 중에 있는데요.

다음과 같은 회비정보 테이블이 있습니다.

___________________

회원번호, 회비년도

20070425, 2011

20070425, 2010

20070425, 2009

20070425, 2007

20060425, 2011

20060425, 2010

20060425, 2008

20060425, 2006

-------------------------------

출력하고자 하는 데이터는

중간에 한번이라도 회비납부를 하지 않은 회원번호와 납부하지 않은 년도입니다.

위 테이블은 아래와 같이 출력해야 합니다.

20070425, 2008

20060425, 2009.  2007

SQL로 가능할까요? 궁금합니다.

회원번호 앞의 네자리는 가입년도입니다.

 

좋은 답변 부탁드립니다.

이 글에 대한 댓글이 총 3건 있습니다.

with t as (
select '20070425' no, 2011 yr from dual union all
select '20070425', 2010 from dual union all
select '20070425', 2009 from dual union all
select '20070425', 2007 from dual union all
select '20060425', 2011 from dual union all
select '20060425', 2010 from dual union all
select '20060425', 2008 from dual union all
select '20060425', 2006 from dual
),    p as (
select 2005 + level yr
  from dual
connect by level <= 20
),    c as (
select '20070425' no from dual union all
select '20060425' from dual
),    n as (
select no
     , min(yr) min_yr
     , max(yr) max_yr
  from t
 group by no
)
select a.no, a.yr
  from ( select no, yr
           from p, c
       )  a
      , t b
      , n c
 where a.no  = b.no (+)
   and a.yr  = b.yr (+)
   and a.no  = c.no
   and a.yr >= c.min_yr
   and a.yr <= c.max_yr
   and b.yr is null
 order by 1, 2 desc

가로로 펼치지는 못했습니다.

知音(sunnylee72)님이 2011-07-20 23:39에 작성한 댓글입니다.

답변 감사드립니다.

 

그런데.. 이건 예시라서요..

수백 개의 회원사를 조회하는건데, 알려 주신 형태로 하는 건 불가능할 것 같네요. ^_^;;

 

smooji님이 2011-07-21 09:22에 작성한 댓글입니다. Edit
SELECT id
     , LTRIM(
       DECODE(MAX(DECODE(SIGN(s-e+0),1,1,DECODE(y,e-0,1,0))),0,','||(e-0))
    || DECODE(MAX(DECODE(SIGN(s-e+1),1,1,DECODE(y,e-1,1,0))),0,','||(e-1))
    || DECODE(MAX(DECODE(SIGN(s-e+2),1,1,DECODE(y,e-2,1,0))),0,','||(e-2))
    || DECODE(MAX(DECODE(SIGN(s-e+3),1,1,DECODE(y,e-3,1,0))),0,','||(e-3))
    || DECODE(MAX(DECODE(SIGN(s-e+4),1,1,DECODE(y,e-4,1,0))),0,','||(e-4))
    || DECODE(MAX(DECODE(SIGN(s-e+5),1,1,DECODE(y,e-5,1,0))),0,','||(e-5))
    || DECODE(MAX(DECODE(SIGN(s-e+6),1,1,DECODE(y,e-6,1,0))),0,','||(e-6))
    || DECODE(MAX(DECODE(SIGN(s-e+7),1,1,DECODE(y,e-7,1,0))),0,','||(e-7))
    || DECODE(MAX(DECODE(SIGN(s-e+8),1,1,DECODE(y,e-8,1,0))),0,','||(e-8))
    || DECODE(MAX(DECODE(SIGN(s-e+9),1,1,DECODE(y,e-9,1,0))),0,','||(e-9))
     , ',') except_y
  FROM (
        SELECT id
             , y
             , SUBSTR(id, 1, 4) s
             , TO_CHAR(sysdate, 'yyyy') e 
          FROM (  -- 테이블 데이터 --
                SELECT '20070425' id, '2011' y FROM dual
                UNION ALL SELECT '20070425', '2010' FROM dual
                UNION ALL SELECT '20070425', '2009' FROM dual
                UNION ALL SELECT '20070425', '2007' FROM dual
                UNION ALL SELECT '20060425', '2011' FROM dual
                UNION ALL SELECT '20060425', '2010' FROM dual
                UNION ALL SELECT '20060425', '2008' FROM dual
                UNION ALL SELECT '20060425', '2006' FROM dual
                ) -- 테이블 데이터 --
        )
 GROUP BY id, e
;

마농(manon94)님이 2011-07-21 10:05에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
38724목표값 찾기?? [5]
양승일
2011-07-21
4920
38723급하게 질문올립니다 디비접속시 ORA04031 에러와 디비 접속 불 [1]
신휘호
2011-07-21
4212
38722그룹 문의 [1]
레이첼
2011-07-20
3144
38721회비 납부 관련 문의 [3]
강진묵
2011-07-20
4202
38720조인 문의 [1]
레이첼
2011-07-20
3052
38719시작일자와 종료일자를 가지는 테이블에 기간을 일별로 세로로 출력하고 싶어요. [3]
초보
2011-07-20
4019
38718select 조인문 쿼리 부탁드립니다. [2]
김연우
2011-07-20
3546
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다