Q&A

  • 오라클 쿼리 관련....도와주세요
안녕하세요 고수님들 도움을 요청합니다.

오라클에서 다음과 같이 데이터를 가져오려구하는데 잘 안되네요.

고수닙들의 한수를 배우고자 글을 올립니다.


수납테이블 테이블에 아래와 같은 필드와 데이터들이 있습니다

납부자번호  미납일자
====================
      900001  20020101
      900001  20020201
      900001  20020301
      900002  20020101
      900002  20020501

뽑아오고자하는 형식은

납부자번호별로 미납월을 한 레코드에 나타내려고 합니다.

형식은 다음과 같습니다

납부자번호  미납월1  미납월 2  미납월3   미납월4......미납월15 (여기가끝)
===================================================================
900001       20020101 20020201 20020301  더이상 미납월이 없으면 (''값처리)
900002       20020101 20020501 더이상 미납월이 없으면 (''값처리)

이런 식으로 하려고 합니다

부탁드립니다 고수님들
8  COMMENTS
  • Profile
    이병훈 2003.01.23 11:32
    안녕하세요.

    제가 이렇게 함 풀어 봤습니다. ^^

    create table tab_tmp (
       a varchar2(6),
       b varchar2(8)
    );

    insert into tab_tmp values('900001',  '20020101');
    insert into tab_tmp values('900001',  '20020201');
    insert into tab_tmp values('900001',  '20020301');
    insert into tab_tmp values('900002',  '20020101');
    insert into tab_tmp values('900002',  '20020501');


    SELECT A
         , TO_CHAR(SUM(DECODE(RUM, 1, B))) "1"
         , TO_CHAR(SUM(DECODE(RUM, 2, B))) "2"
         , TO_CHAR(SUM(DECODE(RUM, 3, B))) "3"
         , TO_CHAR(SUM(DECODE(RUM, 4, B))) "4"
         , TO_CHAR(SUM(DECODE(RUM, 5, B))) "5"
         , TO_CHAR(SUM(DECODE(RUM, 6, B))) "6"
         , TO_CHAR(SUM(DECODE(RUM, 7, B))) "7"
         , TO_CHAR(SUM(DECODE(RUM, 8, B))) "8"
         , TO_CHAR(SUM(DECODE(RUM, 9, B))) "9"
         , TO_CHAR(SUM(DECODE(RUM, 10, B))) "10"
         , TO_CHAR(SUM(DECODE(RUM, 11, B))) "11"
         , TO_CHAR(SUM(DECODE(RUM, 12, B))) "12"
         , TO_CHAR(SUM(DECODE(RUM, 13, B))) "13"
         , TO_CHAR(SUM(DECODE(RUM, 14, B))) "14"
         , TO_CHAR(SUM(DECODE(RUM, 15, B))) "15"
      FROM (SELECT A
                  , B
                  , ROW_NUMBER() OVER (PARTITION BY A ORDER BY A) RUM
               FROM TAB_TMP
             )
    GROUP BY A

    오라클을 사용하신다고 하니 어날리틱펑션을 사용하실수 있을 겁니다.
    물론 8i 이상에서만 가능하죠. ^^;;

    머. 나름대로 속도도 나올꺼구요.  테스트 해봤는데....

    실제로는 어떨지 모르겠네요. ^^

    그럼 수고하세요. ^^

    그냥 참고하시라 적어 봤습니다.


  • Profile
    호롱불 2003.01.21 20:07
    데이타가 많을 경우.문제가 될거 같네요.,...

    전제조건이..15개의.. 미납월만 나타내준다면...
    아래처럼 가능할 거 같아요....

    테이블  << TB_T  >>
    MembCode    CalcDate



    Select
            MembCode,
            (
            Select
                    CalcDate
            From
                    (
                    Select
                            MembCode,
                            CalcDate,
                            (Select Count(*) From TB_T Where MembCode = M.MembCode And CalcDate < M.CalcDate) As SCnt
                    From
                            TB_T M                                        
                    ) Sub
            Where
                    SCnt = 0 And MembCode = S.MembCode
            ) As m1,        
            (
            Select
                    CalcDate
            From
                    (
                    Select
                            MembCode,
                            CalcDate,
                            (Select Count(*) From TB_T Where MembCode = M.MembCode And CalcDate < M.CalcDate) As SCnt
                    From
                            TB_T M                                        
                    ) Sub
            Where
                    SCnt = 1 And MembCode = S.MembCode
            ) As m2,
            (
            Select
                    CalcDate
            From
                    (
                    Select
                            MembCode,
                            CalcDate,
                            (Select Count(*) From TB_T Where MembCode = M.MembCode And CalcDate < M.CalcDate) As SCnt
                    From
                            TB_T M                                        
                    ) Sub
            Where
                    SCnt = 2 And MembCode = S.MembCode          
            ) As m3,
            (
            Select
                    CalcDate
            From
                    (
                    Select
                            MembCode,
                            CalcDate,
                            (Select Count(*) From TB_T Where MembCode = M.MembCode And CalcDate < M.CalcDate) As SCnt
                    From
                            TB_T M                                        
                    ) Sub
            Where
                    SCnt = 3 And MembCode = S.MembCode          
            ) As m4,
            (
            Select
                    CalcDate
            From
                    (
                    Select
                            MembCode,
                            CalcDate,
                            (Select Count(*) From TB_T Where MembCode = M.MembCode And CalcDate < M.CalcDate) As SCnt
                    From
                            TB_T M                                        
                    ) Sub
            Where
                    SCnt = 4 And MembCode = S.MembCode          
            ) As m5
    From
            (
            Select
                    Distinct
                    MembCode
            From
                    TB_T
            ) S

    ..수고하세염...



    ----------------------------------------------------------------
  • Profile
    하얀까마귀 2003.01.22 22:12
    안녕하세요 하얀까마귀 입니다.

    대단하십니다..

    이제야 봤는데 돌려보지는 않았습니다만 쿼리를 보니 결과가 맞게 나올것

    같네요.. ^^

    '그런쿼리는 안됩니다' 라고 답변썼다가 된통 얻어맞은 느낌이네요.. ㅠㅠ

    변명을 하자면.. 호롱불님도 언급을 하셧지만.. 데이타가 좀 되는경우엔

    밑의 방법으로 하면 속도가 많이 늦을것 같네요..

    실제로 쿼리를 쓰게되면 디비엔진에서 템프테이블을 만드는경우가 많습니다.

    해서 쿼리가 복잡해 지는경우엔 임시테이블을 만들어서 이러한 서버의 부하를

    줄여주는것도 좋을듯 하네요..

    에구구.. 다시는 단정적으로 안써야지..

  • Profile
    열심히 2003.01.21 12:49
    가능합니다. 쿼리만으론 불가능 하구요..프로그램에서 쿼리를 만들어야겠죠..

    뭐냐면은 먼저 님이 불러오고 싶은 미납월의 조건을 준다음 몇개인지 불러오지요...

    그런다음 갯수만큼 루핑을 돌려서 쿼리를 만들면 됩니다...간단하지요..

    아래와 같은경우는 열이 늘어나니깐 select문의 필드를 늘려야겠네요..

    여러개의 DECODE문을 루핑을 돌려서 쿼리를 만들어줍니다..

    from절 이하는 변경하지 않아도 될것 같네요..

    이래도 모르시겠다면 다시 질문은....

  • Profile
    하얀까마귀 2003.01.21 13:10
    안녕하세요 하얀까마귀 입니다.

    그런 쿼리는 안됩니다 라고 해놨더니.. ㅠㅠ 너무 단정적이었나요?

    첫째. case 문으로는 안될것 같네요.. 일단 결과의 월이 각각의 납부번호에
    따라서 조건이 다 틀려지니까요. 하지만 불가능 한건 아니겠죠..
    각각의 납부번호에 따라서 각각의 case문을 만들어주면 될테니까요..
    하지만. 이건 ㅠㅠ 데이타의 건수가 몇개일지도 모르는데 이렇게만드는건
    문제가 될것 같네요..

    그리고 오라클에는 case문이 없는걸로 알고 있는데.. 아닌가? 이건 정확한건 아니구요.. ㅠㅠ ms-SQL 명령어 같은데.. 오라클에서는 Decode를 써야겠죠.
    하지만 이넘도.. 마찬가지 문제일것 같네요..(case는 한번확인해봐야겠네요.^^)
    처음 이야기한것처럼. 만들려는 필드들이.. 특정월을 지칭하는거라면 Decode
    문으로 충분히 만들수 있으리라 생각됩니다만.
    이건 처음필들에 들어가야 되는 값이 정해져 잇지 않습니다. 맞나요?

    수납일자에 왜 미납일자가 들어가는지는 모르겠지만 해당 미납일자를 순서대로 출력하고 싶으신거니까..

    그렇게 만들지는 못할것 같네요. 물론 불가능한건 아니죠..

    이것또한 각각의 납부번호에 따른 decode를 만들어주면 가능합니다만.
    쿼리 결과가 많다면..... 문제는 심각해질수도 있겠죠..

    제생각에는 아마도 어떤 리포트를 출력하기 위해서 해당 쿼리를 부르고 싶으신것 같은데.. 이러한 경우에는 그냥 무식하게... 지금처럼 쿼리를 써서 데이타를
    불러와서 프로그램에서 첵크해서 넣어주는게 가장좋습니다.

    부득이하게 ( 연산이 많이 들어가면 복잡해지니까.. ) 하나의 테이블에 만들어 넣고 싶으시다면
    임시테이블을 하나 생성하셔서. 프로그램에서 불러오고 싶은 형식데로 데이타를 Insert 시키시는게 맞을껍니다.
    그리고 그 테이블을 다시 불러오는거죠..

    물론 이렇게 임시테이블을 생성하는것도 데이타가 무지하게 많다면 문제가 될수도 있습니다..
    오라클이라면 분명 C/S환경에서 일텐데. 불러와지는 데이타의 양이 얼마나 될리지는 예상하셔야 겠죠..

    음.. 이런거라면 제가 아는한 역시 임시테이블이 가장 적절한 방법인것 같네요..

    하지만 데이타가 아주 많다면.. 한 백만단위가 넘어가는 거라면 이방법도 역시...... ㅠㅠ 그럴때는 어쩔수 없이 서버에서 돌아가도록 하서야 할겁니다.
    스토어드 프로시져같은걸로 해당 작업을 구현하시는게 좋을듯 합니다.

    그럼.. 참고하시구요.. 도움이 되셧기를..
    즐거운시간 되세요.
  • Profile
    Galaxy 2003.01.21 02:43
    안녕하세요
    수고 많습니다.

    정답을 드리지 못해서 죄송합니다.

    저는 그게 가능하다고 생각 합니다.

    Case 문을 이용하면 될것 같습니다.

    먼저 납부자 중복 되는것을 없애고

    해당되는 납부자번호에 관련된 미납일자을  가지고 오면 될것 같은데...

    미납월 1,2,...,11,12을 생성하여 뿌려 주면 될것 같은데...

    죄송 합니다.

    죽을 죄을 졌습니다.

    그럼 수고 하세요

  • Profile
    김동화 2003.01.21 02:55
    구체적으로 어떤 식으로 하는지도 알려주시면 감사하겠습니다.

    감이 잘 오지 않아서요.

    항상 건강하세요.


    - 답변주신 모든분들게 감사의 말씀을 드립니다. -


  • Profile
    하얀까마귀 2003.01.21 01:13
    안녕하세요 하얀까마귀 입니다.

    제가 아는한 아무리 오라클이라 하더라도 말씀하신 쿼리는 만들수 없습니다.

    각각의 월이 정해져 있다면 다시 말해서 결과를 가져오는 필드가
    1월에서 12월까지의 데이타에 각각의 월을 첵크하는거라면 만들수 있겠지만

    몇건인지 그리고 데이타가 있는지도 모르는 상태에서 각각의 납부자
    번호에 미납일자를 각각의 필드에 넣어주는건 안됩니다.
    가능하다 하더라도 서버쪽 부하가 너무나도 걸리겠죠..

    스토어드 프로시져를 이용해서 만드시던지 아니면 프로그램에서 임시테이블
    을 만드셔서 하도록 하세요 그게 결과적으로 나을껍니다.

    그럼.. 즐거운시간 되세요.

    • 김동화
    • 2003.01.20 23:40
    • 8 COMMENTS
    • /
    • 0 LIKES
    • 이병훈
      2003.01.23 11:32
      안녕하세요. 제가 이렇게 함 풀어 봤습니다. ^^ create table tab_tmp (    a varchar2(...
    • 호롱불
      2003.01.21 20:07
      데이타가 많을 경우.문제가 될거 같네요.,... 전제조건이..15개의.. 미납월만 나타내준다면... 아래처...
    • 하얀까마귀
      2003.01.22 22:12
      안녕하세요 하얀까마귀 입니다. 대단하십니다.. 이제야 봤는데 돌려보지는 않았습니다만 쿼리를 보니...
    • 열심히
      2003.01.21 12:49
      가능합니다. 쿼리만으론 불가능 하구요..프로그램에서 쿼리를 만들어야겠죠.. 뭐냐면은 먼저 님이 불러...
    • 하얀까마귀
      2003.01.21 13:10
      안녕하세요 하얀까마귀 입니다. 그런 쿼리는 안됩니다 라고 해놨더니.. ㅠㅠ 너무 단정적이었나요? ...
    • Galaxy
      2003.01.21 02:43
      안녕하세요 수고 많습니다. 정답을 드리지 못해서 죄송합니다. 저는 그게 가능하다고 생각 합니다. ...
    • 김동화
      2003.01.21 02:55
      구체적으로 어떤 식으로 하는지도 알려주시면 감사하겠습니다. 감이 잘 오지 않아서요. 항상 건강하...
    • • • •
    • shem
    • 2003.01.20 22:49
    • 0 COMMENTS
    • /
    • 0 LIKES
    • Galaxy
    • 2003.01.20 22:10
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 임형호
      2003.01.20 23:21
      일단 aadba 알리아스를 SQLExplorer 에서 직접 Open 해보세요. 만약 Open 이 안된다면...  Al...
    • Galaxy
      2003.01.21 00:32
      감사 합니다. 잘못 했다간 Format 하고 다시 설치 할뻔 했습니다. sa 계정의 암호를 지우고 새로 입...
    • 권태균
    • 2003.01.20 21:35
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 하얀까마귀
      2003.01.21 01:18
      안녕하세요 하얀까마귀 입니다. 답변이 없는건 질문하신 내용에 좀 문제가 있군요.. 프로그램이 이유...
    • 유석민
    • 2003.01.20 21:29
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 하얀까마귀
      2003.01.21 01:20
      안녕하세요 하얀까마귀 입니다. 어떻게 연동시키신다는건지 잘 모르겠군요.. 먼저 asp에서 출력버튼...
    • 유석민
      2003.01.21 03:26
      답변 감사 합니다 많은 도움이 되었구여.. 제가 개발 하고자 하는 것은 시험에 응시한 수험표를 일괄적으...
    • Nalrsis
    • 2003.01.20 20:46
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 서상현
    • 2003.01.20 20:25
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2003.01.21 21:30
      안녕하세요. 최용일입니다. ReplaceStrings함수를 이용해서 NewLine이나 Carriage Return을 널문자로 치...
    • 전용수
    • 2003.01.20 05:33
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 강정구
      2003.01.20 07:02
      query.first     //쿼리의 처음으로 커서를 옮김 edit1.text:=adoquery1.fieldby...
    • gokick
      2003.01.20 19:47
      (TSearchRec.Attr and faDirectory) = faDirectory 이렇게 하믄 안될까여^^^
    • 임우식
      2003.01.20 08:07
      create table bogm_test ( no integer identity(1,1) name varchar(10) ) 위와 같이 하면 no와...
    • 휴초보
    • 2003.01.20 01:30
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 호롱불
      2003.01.21 20:47
      상호별 담당자 수가 최대 3이라면.. 얼마든지 가능한거 같네요...무식한 방법이지만...ㅋㅋ << T...
    • 임형호
      2003.01.20 23:28
      일단은 DB구조가 좀 이상하네요. 상호코드와 상호 이렇게 한테이블,  상호코드, 담당자명 이렇...
    • 임우식
      2003.01.20 08:10
      이것은 쿼리문으로만 처리하기가 ....쩝 저는 잘 몰라서 그러는데... 이런내용은 쿼리후 프로그램을 사용...
    • 김지엽
      2003.01.20 02:51
      만들어 달라는 것은 질문하시는 분 스스로에게도 별로 도움이 되지 않는다고 생각합니다. 스스로 만들어 보...
    • 조현석
    • 2003.01.19 12:59
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 임형호
      2003.01.20 23:14
      이곳 자료실에가서 검색에서 '파스칼' 이라고 치면요... 오브젝트파스칼 관련 문서가 있습니다. 또 ...
    • 윤민규
    • 2003.01.19 00:54
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 임우식
      2003.01.20 08:15
      뭐 상관없는 내용 같지만...저같은경우에는요 그림을 DB에 포함시키지 않고 다만 그림경로와 파일명만 필...
    • 구창민
      2003.01.18 22:37
      안녕하세요~ 구창민입니다. 아래를 눌러보세여~~~ http://www.delphi.co.kr/zboard/view.php?id=co...
    • 최재호
      2003.01.20 20:44
      장치관리자에서 키보드 설정을 바꾸고 재부팅하니까 드디어 작동됩니다. 저는 101키(종류3)으로 설정을 ...
    • 야정호
    • 2003.01.18 20:35
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 임형호
      2003.01.18 23:19
      음...일단 TQuery는 Read-Only가 Default입니다. TQuery 로 append, delete, edit 등의 명령어를 사용...
    • 포 맷
    • 2003.01.18 19:43
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 임형호
      2003.01.18 23:34
      인터베이스 isql은 인터베이스라고 볼랜드사에서 만든 DBMS를 사용할때 사용하시는거구요 BDE를 이용하...
    • 임우식
      2003.01.20 08:20
      퀵리포트에 연결하는것은 dataset컴포넌트죠. 그리고 dataset은 ADO를 통해 mssql에 연결가능하므로 굳이 ...