Q&A

  • 쿼리문 질문입니다
고수님들에게 부탁드려요.

델 5 / Paradox 쓰고요

인적 사항 db1 과 개개인의 출입현황을 담은 db2

두 db를 이름으로 join 하여

인적 사항별 각 조건과 함께 -> db1만으로도 검색 가능하져.
임의 기간내 임의의 출입횟수 조건에 맞는 명단을 찾으려 합니다 -> db2 에서 찾아야 하겠쪄..ㅡ.ㅡa;;
..헌데 어떻게 해야할른지..join 문과 Exists(맞나?)등 써 봤눈데..
계속 속만 태우공.

db1
성명......생일.......기타
성춘향...02.02......
연흥부...03.03......
홍길동...01.01......

db2
성명......출입일....
홍길동...01.01......
연흥부...01.03......
성춘향...02.02......
홍길동...03.01......
성춘향...03.02......
홍길동...04.01......
연흥부...05.03......
성춘향...06.02......
홍길동...07.01......
연흥부...08.03......

얻고자 하는것은

1월부터 12월까지 생일자이면서
2월1일~6월2일까지 두번이상 출입한 명단

성명......생일.....출입횟수...기타...
성춘향...02.02..........3.....
홍길동...04.01..........2.....

이상임돠...

단독 db만 갖고는 뭐든 얻었눈뎅..
join들러가닌깐 눈물이 핑~ 도네요.

고수님께 부탁드립니다

10  COMMENTS
  • Profile
    김경록 2003.11.23 00:58
    이건, Sub-Query가 없다면, 해결할 수 없는 문제이군여..
    Paradox는 Sub-Query를 지원하지 않으므로
    편법을 사용하셔야겠군여..
    임시로, 2월1일에서 6월1일까지의 통계를 생성한 Table을
    먼저 만드셔야겠군여..
    (버튼 클릭하여 SQL문 수행시 해당 Table 생성 - [Table 동적생성])
    그리고 그것과 outer join을 수행해야 올바른 결과를
    얻을 수 있을 겁니다.
    그렇게 하지 않는다면, 방법이 없군여..


  • Profile
    최진술 2003.11.21 00:03
    원하시는게 SQL 한 문장으로 JOIN 해서 답을 얻고자 하신다면
    아래의 방법을 써보세요.. FROM 이후절에 SELECT 문을 사용하면 될 것 같네요...

    SELECT A.KNAME,A.YMD1,B.CNT FROM DB1 A,(SELECT YNAME,COUNT(*) AS CNT FROM DB2  WHERE YMD2>='20030201' AND YMD2<='20030602' GROUP BY YNAME HAVING COUNT(*)>=2) B
    WHERE A.KNAME=B.YNAME

    =>>설명

    DB1 테이블의 KNAME은 성명,YMD1은 생일
    DB2 테이블의 YNAME은 성명,YMD2은 출입일자

    우선 DB2의 테이블에서 2월1일~6월2일 (WHERE 조건) 까지 두번이상 출입(HAVING  COUNT~)  한 명단을 먼저 획득하면서 (FROM 이후절의 SELECT~) 테이블 DB1과 이름이 같은 조건으로 JOIN 하시면  됩니다..


  • Profile
    채수정 2003.11.21 04:19
    관심과 도움 말씀에 감사드림돠.(-.-)(_._)

    도움 말씀대로 해 보았습니다..만..
    From 이후 Select 절에서

    Invalid use of keyword
    Token: Select
    ... 발생하네요...많이 보던 거져..

    이것 저것 건드려 봤습니다만..계속해서..

    담은 미천한 제 쏘쓰임돠...

    무엇이 잘못된건지..콕~ 찔러 주시기 바랍니다.

    with Query1 do begin
      Close;
      SQL.Clear;
      SQL.Add('Select A.Name,A.NameNo,A.Bir,기타....');
      SQL.Add('From DB1 A');
      if(Checkbox5.Checked)then begin
        SQL.Add(',(Select Name,NameNo,Count(*) AS CNT FROM DB2');
        SQL.Add('where Date1>:시작일 and Date1<:마지막일 Group By Name,NameNo');
        SQL.Add('HAVING COUNT(*)>=:출입횟수1 and COUNT(*)<=:출입횟수2) B');
      end;
      SQL.Add('where');
      if(Checkbox5.Checked)then begin
        SQL.Add('A.Name=B.Name and A.NameNo=B.NameNo');
        SQL.Add('and');
      end;
      if(Checkbox1.Checked)then begin
        .
      end;
      .
      .
      SQL.Delete(SQL.Count-1);
      .
      .
      if(Checkbox1Checked)then begin
        .
      end;
      .
      if(Checkbox5.Checked)then begin
        ParamByName('시작일').AsString:=시작일;
        ParamByName('마지막일').AsString:=마지막일;
        ParamByName('출입횟수1').AsFloat:=출입횟수1;
        ParamByName('출입횟수2').AsFloat:=출입횟수2;
      end;
      .
      Open;
    end;

    Open 후  DBGrid 로 보려 합니다..

    자꾸 귀찬케 해드려 죄송함돠.

    한번 더 부탁 드리겠슴돠.

  • Profile
    최진술 2003.11.22 19:15
    코딩하신 소스를 보면 생략된 부분이 있긴하지만  잘못된 부분은 없는 것 같네요.. 하지만 MESSAGE의 내용은 SQL문에서의 적절치 못한 내용을 포함한 듯합니다!

    올리신 소스를 간략히 정리해서 제가 테스트 해보았습니다만 error없이 수행되어 DBGRID 에 보여집니다! .. 소스를 다시한번 심플하게 줄여서 먼저 테스트해보시는 것도 디버깅의 한 방법이 되리라고 생각됩니다..

    테스트 환경은 Delphi6.0 과 DB는 MS SQL입니다!
    문의 하신 Paradox DB 환경은 아니지만 대부분의 문법은 통용되리라 봅니다!

    =>> 아래는 올리신 소스를 간략히 정리한 내용입니다! 물론 error는 없었구요!..참조하세요!!  
      

      with Query1 do begin
        Close;
        SQL.Clear;
        SQL.Add('Select A.KName,A.NameNo,A.BIR');
        SQL.Add('From TEMP001 A');
        SQL.Add(',(Select KName,NameNo,Count(*) AS CNT FROM TEMP002');
        SQL.Add('where Date1>:FIRSTDAY and Date1<:LASTDAY Group By KName,NameNo');
        SQL.Add('HAVING COUNT(*)>=:IOCNT1 and COUNT(*)<=:IOCNT2) B');
        SQL.Add('where');
        SQL.Add('A.KName=B.KName and A.NameNo=B.NameNo');
        ParamByName('FIRSTDAY').AsString:='20030201';
        ParamByName('LASTDAY').AsString:='20030602';
        ParamByName('IOCNT1').AsFloat:=2;
        ParamByName('IOCNT2').AsFloat:=3;
        query1.Open;
      end;


    >관심과 도움 말씀에 감사드림돠.(-.-)(_._)
    >
    >도움 말씀대로 해 보았습니다..만..
    >From 이후 Select 절에서
    >
    >Invalid use of keyword
    >Token: Select
    >... 발생하네요...많이 보던 거져..
    >
    >이것 저것 건드려 봤습니다만..계속해서..
    >
    >담은 미천한 제 쏘쓰임돠...
    >
    >무엇이 잘못된건지..콕~ 찔러 주시기 바랍니다.
    >
    >with Query1 do begin
    >  Close;
    >  SQL.Clear;
    >  SQL.Add('Select A.Name,A.NameNo,A.Bir,기타....');
    >  SQL.Add('From DB1 A');
    >  if(Checkbox5.Checked)then begin
    >    SQL.Add(',(Select Name,NameNo,Count(*) AS CNT FROM DB2');
    >    SQL.Add('where Date1>:시작일 and Date1<:마지막일 Group By Name,NameNo');
    >    SQL.Add('HAVING COUNT(*)>=:출입횟수1 and COUNT(*)<=:출입횟수2) B');
    >  end;
    >  SQL.Add('where');
    >  if(Checkbox5.Checked)then begin
    >    SQL.Add('A.Name=B.Name and A.NameNo=B.NameNo');
    >    SQL.Add('and');
    >  end;
    >  if(Checkbox1.Checked)then begin
    >    .
    >  end;
    >  .
    >  .
    >  SQL.Delete(SQL.Count-1);
    >  .
    >  .
    >  if(Checkbox1Checked)then begin
    >    .
    >  end;
    >  .
    >  if(Checkbox5.Checked)then begin
    >    ParamByName('시작일').AsString:=시작일;
    >    ParamByName('마지막일').AsString:=마지막일;
    >    ParamByName('출입횟수1').AsFloat:=출입횟수1;
    >    ParamByName('출입횟수2').AsFloat:=출입횟수2;
    >  end;
    >  .
    >  Open;
    >end;
    >
    >Open 후  DBGrid 로 보려 합니다..
    >
    >자꾸 귀찬케 해드려 죄송함돠.
    >
    >한번 더 부탁 드리겠슴돠.
    >
    >> 원하시는게 SQL 한 문장으로 JOIN 해서 답을 얻고자 하신다면
    >>아래의 방법을 써보세요.. FROM 이후절에 SELECT 문을 사용하면 될 것 같네요...
    >>
    >>SELECT A.KNAME,A.YMD1,B.CNT FROM DB1 A,(SELECT YNAME,COUNT(*) AS CNT FROM DB2  WHERE YMD2>='20030201' AND YMD2<='20030602' GROUP BY YNAME HAVING COUNT(*)>=2) B
    >>WHERE A.KNAME=B.YNAME
    >>
    >>=>>설명
    >>
    >>DB1 테이블의 KNAME은 성명,YMD1은 생일
    >>DB2 테이블의 YNAME은 성명,YMD2은 출입일자
    >>
    >>우선 DB2의 테이블에서 2월1일~6월2일 (WHERE 조건) 까지 두번이상 출입(HAVING  COUNT~)  한 명단을 먼저 획득하면서 (FROM 이후절의 SELECT~) 테이블 DB1과 이름이 같은 조건으로 JOIN 하시면  됩니다..
    >>
    >>
    >>>고수님들에게 부탁드려요.
    >>>
    >>>델 5 / Paradox 쓰고요
    >>>
    >>>인적 사항 db1 과 개개인의 출입현황을 담은 db2
    >>>
    >>>두 db를 이름으로 join 하여
    >>>
    >>>인적 사항별 각 조건과 함께 -> db1만으로도 검색 가능하져.
    >>>임의 기간내 임의의 출입횟수 조건에 맞는 명단을 찾으려 합니다 -> db2 에서 찾아야 하겠쪄..ㅡ.ㅡa;;
    >>>..헌데 어떻게 해야할른지..join 문과 Exists(맞나?)등 써 봤눈데..
    >>>계속 속만 태우공.
    >>>
    >>>db1
    >>>성명......생일.......기타
    >>>성춘향...02.02......
    >>>연흥부...03.03......
    >>>홍길동...01.01......
    >>>
    >>>db2
    >>>성명......출입일....
    >>>홍길동...01.01......
    >>>연흥부...01.03......
    >>>성춘향...02.02......
    >>>홍길동...03.01......
    >>>성춘향...03.02......
    >>>홍길동...04.01......
    >>>연흥부...05.03......
    >>>성춘향...06.02......
    >>>홍길동...07.01......
    >>>연흥부...08.03......
    >>>
    >>>얻고자 하는것은
    >>>
    >>>1월부터 12월까지 생일자이면서
    >>>2월1일~6월2일까지 두번이상 출입한 명단
    >>>
    >>>성명......생일.....출입횟수...기타...
    >>>성춘향...02.02..........3.....
    >>>홍길동...04.01..........2.....
    >>>
    >>>이상임돠...
    >>>
    >>>단독 db만 갖고는 뭐든 얻었눈뎅..
    >>>join들러가닌깐 눈물이 핑~ 도네요.
    >>>
    >>>고수님께 부탁드립니다
    >>>
    >>>
    >>
    >
  • Profile
    채수정 2003.11.22 21:03
    부족한 소스를 정리까지 해주시고 정말 고맙습니다.

    헌데 역쉬..님께서 테스트 하신 버젼과 DB 차이의 환경탓인지..
    Delphi 5.0 과 Paradox 에서는 전과 같은 반복 되는 에러가 뜨는군여

    with Query1 do begin
       Close;
       SQL.Clear;
       SQL.Add('Select A.KName,A.NameNo,A.BIR');
       SQL.Add('From TEMP001 A');
       SQL.Add(',(Select KName,NameNo,Count(*) AS CNT FROM TEMP002'); <<- 이부분에서..걸리는군용..Select 를 인정(?)치 않는건지..
       SQL.Add('where Date1>:FIRSTDAY and Date1<:LASTDAY Group By KName,NameNo');
       SQL.Add('HAVING COUNT(*)>=:IOCNT1 and COUNT(*)<=:IOCNT2) B');
       SQL.Add('where');
       SQL.Add('A.KName=B.KName and A.NameNo=B.NameNo');
       ParamByName('FIRSTDAY').AsString:='20030201';
       ParamByName('LASTDAY').AsString:='20030602';
       ParamByName('IOCNT1').AsFloat:=2;
       ParamByName('IOCNT2').AsFloat:=3;
       query1.Open;
    end;

    직접 코딩을 해보기도 했꾸..SQLEditer를 이용해서 테스트를 해봤습니다만..
    같은 에러가 뜨는군요.

    다른님께서 말씀하신대로 UpdateSQL 은 먼저 붙여서 해봤지만 역쉬 마찬가지 이구여

    하.지.만....안될일이 있겠나요..^^;;
    다른 방법을 찾아서 라두 해야겠
  • Profile
    너구리 2003.12.02 02:49
    아 updatesql만 붙이는게 아니라요..

    cachedupdate도 tru로 해주고

    requestlive도 true로 해주시면 될것 같은데..

    제가 답변을 너무 무성의 하게 했네요..

  • Profile
    열심히 2003.11.22 13:27
    전에 Delphi 4.0 쓸때에 저도 그런적이 있는데..

    그냥 Query1에 updatesql을 연결해 보세요 그러니깐

    되더라구요..보통 인라인뷰를 쓰면 저리 되던데..

    끝끝내 저도 왜그런지는 모르겠구요..

    updatesql붙이면 될거 같아요..다른 버젼에서도 이런가??

  • Profile
    skysoft 2003.11.19 19:27
    참고하세요.
    아시는 것처럼

    select a.성명, a.생일, b.출입일
    from A a, B b
    where a.성명=b.성명
       and a.생일 between '19800101' and '19801231'
       and b.출입일 between '20030201' and '20030602'
    order by a.성명

    이렇게 select 해서 델파이에서 처리를 할 수 있겠네요.

      Query1.First;
      sName := Query1.FieldByName('name').AsString;
      iCount := 1;

      while not Query1.Eof do begin
        
        if Query1.FieldByName('name').AsString <> sName then begin
          if iCount > 1 then begin
            Memo1.Lines.Add(sName + 생일 + iCount); //회수 2회이상이면 추가함
          end;
          sName := Query1.FieldByName('name').AsString;
          iCount := 1;
        end else begin
          iCount := iCount + 1;
        end;

        Query1.Next;
      end;


  • Profile
    채수정 2003.11.23 03:58
    많은님들의 도움 받아 요리 조리 굴리던중에
    원하는 결과를 얻을수가 있었씀다
    도와 주신님들에게 감사 드립니다.
    허접하지만 다른님들도 참고 되셨음합니다.

    Select A.CName,A.CNameNo,Count(*) as CNT
    from DB1.db A , DB2.db B
    where A.CName=B.CName and A.CNameNo=B.CNameNo
    and B.VDate>='2003-01-01' and B.VDate<='2003-06-02'
    and...
    and...
    Group by A.CName,A.CNameNo
    Having Count(*)>=2 and Count(*)<=4
    Order by A.CName,A.CNameNo

    헌데 Group by Field1..Field9 가 Select Field1..Field9  와 같이
    맞아야 하더군요

    도움주셨던님 들에게 다시 한번 감사드립니다.(-.-)(_._)

    즐건 주말,휴일 보내셔욤..

  • Profile
    MIDAS 2003.11.19 19:26
    테이블 레이아웃이 부족한듯 하네요.. 그리고

    두테이블 간의 관계도 표시해 주셔야 정확한 답변을 얻지 않을까 싶습니다.
    • 김배성
    • 2003.11.20 02:40
    • 1 COMMENTS
    • /
    • 0 LIKES
    • pbi12
      2003.11.22 08:04
      안녕하세요. 저도 살짝해본적은 있는데, 트리뷰를 보시면은 / root가 있고, 그 아래 서브트리구조가 생성...
    • 양진영
    • 2003.11.20 01:02
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이추형
      2003.11.21 02:31
      프로젝트를 새로 만드시고요 delphi 3.0에서 delphi 5.0으로 Up되면서 바뀐내용을 적요하시야 겠네요 ...
    • 임진묵
      2003.11.20 00:50
      안녕 하세요. 델 5사용자인데요. 님의 말을 들어 보면..페스트넷에 있는 것을 사용할때 나타나는 증...
    • 곰다방~미스김
      2003.11.20 01:24
      델 6이구요...인디 깔려있어서 인디에 있는 idSMTP사용했습니다. 인증타입을 atLogin으로 하면 인증실패라...
    • 임진묵
      2003.11.20 18:16
      안녕 하세요. 인증 받으려면...인증 체크 하시고  당연 아이디 하고 비밀번호가 있어야 겠지...
    • 곰다방~미스김
      2003.11.20 23:44
      그렇게도 해보고 저렇게도 해봤는데... 안되네요.... 데모도 없고.... 메일서버세팅값을 변경하는 방법...
    • 임진묵
      2003.11.21 19:50
      이상하군요... 제가  센드 메일 8.11.6 과 8.12.5 에서 테스트 하기엔 잘 되는데요.. 제가 처...
    • 최인권
    • 2003.11.19 23:31
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 초초보
      2003.11.20 12:12
      못열어 보는 방법은 당근 없구요... 차라리 그냥 문자열 자체를 별도의 암호화 함수 가져오셔서 암호화 ...
    • 최윤호
    • 2003.11.19 23:13
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 남영석
      2003.11.19 23:46
      해당기능은 저도 몇번해봤는데 안되더라구요. 익스플로러를 임베딩은 되는데 그 안에서 발생하는 키의...
    • 김광호
    • 2003.11.19 23:09
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 이진균
    • 2003.11.19 21:23
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 박동호
      2003.11.19 23:20
      됩니다. 그리드에다 Canvas.Brush.Color  해 놓고 색깔 넣어주면 됩니다.
    • 이진균
      2003.11.22 03:05
      Canvas.Brush.Color를 두번 쓰니 되네요
    • 이추형
      2003.11.21 02:32
      Locate 명령을 쓰셔서 첫번째 스트링그리드의 값에 해당하는 두번째 스트링그리드의 값에 Locate명령주...
    • 채수정
    • 2003.11.19 10:09
    • 10 COMMENTS
    • /
    • 12 LIKES
    • 김경록
      2003.11.23 00:58
      이건, Sub-Query가 없다면, 해결할 수 없는 문제이군여.. Paradox는 Sub-Query를 지원하지 않으므로 편법...
    • 최진술
      2003.11.21 00:03
      원하시는게 SQL 한 문장으로 JOIN 해서 답을 얻고자 하신다면 아래의 방법을 써보세요.. FROM 이후절에 S...
    • 채수정
      2003.11.21 04:19
      관심과 도움 말씀에 감사드림돠.(-.-)(_._) 도움 말씀대로 해 보았습니다..만.. From 이후 Select 절에...
    • 최진술
      2003.11.22 19:15
      코딩하신 소스를 보면 생략된 부분이 있긴하지만  잘못된 부분은 없는 것 같네요.. 하지만 MESSA...
    • 채수정
      2003.11.22 21:03
      부족한 소스를 정리까지 해주시고 정말 고맙습니다. 헌데 역쉬..님께서 테스트 하신 버젼과 DB 차이의 ...
    • 너구리
      2003.12.02 02:49
      아 updatesql만 붙이는게 아니라요.. cachedupdate도 tru로 해주고 requestlive도 true로 해주시면 ...
    • 열심히
      2003.11.22 13:27
      전에 Delphi 4.0 쓸때에 저도 그런적이 있는데.. 그냥 Query1에 updatesql을 연결해 보세요 그러니깐 ...
    • • • •
    • 김동석
      2003.11.21 02:06
      구체적으로 어떤 처리를 하려는 것인지 모르겠지만 TStrings를 써도 될거 같네요... TStrings의 Load...
    • 손희석
      2003.11.19 19:56
      fmCreate         If the file exists, open for write acces...
    • 선게
    • 2003.11.19 08:30
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 델초보
    • 2003.11.19 06:37
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 델초보
      2003.11.21 21:53
      출처 http://www.howtodothings.com/showarticle.asp?article=111" With the Delphi Active Form i...
    • 공왕주
    • 2003.11.19 06:34
    • 1 COMMENTS
    • /
    • 0 LIKES
    • LDS
      2003.11.21 00:39
      꼭 dbGrid를 사용 하셔야 한다면 작업결과가 배열로 넘어 온는 것을 새 테이블을 만들면 간단 할것 같습...
    • goodlsw
    • 2003.11.19 05:54
    • 1 COMMENTS
    • /
    • 0 LIKES
    • skysoft
      2003.11.19 19:53
      만약 텍스트에디터에서 델파이5의 DFM 파일이 열린다면 텍스트에디터에서 제공하는 파일에서 바꾸기(AcroE...
    • 작스
    • 2003.11.19 04:07
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 초초보
      2003.11.20 12:14
      통신관련 부분은 윈도우API를 포장해서 쓰거든요 아마 인디컨포넌트면 될꺼 같은데 근데 ㅡ.ㅡㅋ 왜케 낮...
    • 김종곤
    • 2003.11.19 03:25
    • 0 COMMENTS
    • /
    • 0 LIKES
    • ^자]물병[리^
      2003.11.22 00:22
      제가 찾은 쿼리를 함 올려볼까 합니다.. sqler라는 사이트에서 참고한 겁니다. SELECT   (SE...