Q&A

  • 또 한번 봐주시면 안되나요???
MSSQL 에서 현 외상금액에 대한 잔액 현황을 일자별로 구하는 쿼리입니다.

예를들어 한명의 고객에 대한 외상 및 입금 테이블이 아래와 같다면...

          외상(테이블)                       입금(테이블)
2009-01-11 : 34,000
                                           2009-06-03 : 34,000
2009-10-01 : 17,000  
                                           2009-12-11 : 15,000
2010-02-12 : 13,000  

-위 테이블 자료들을 아래와 같은 결과값의 SQL 을 만들려면
어떻게 해야 하는지 알려 주시면 감사하겠습니다.

결과 값)
=> 현 외상 잔액이 15,000원 이므로
날짜별로 가로로 이 외상 잔액이 언제의 외상인지를 알고 싶은 것입니다.

   회원          2010-02-12            2009-10-01
  홍길동            13,000                      2,000

- 위 화면이 원하는 결과 값인데,  가장 최근인 2010-02-12일에 현 외상 잔액 15,000에서 13,000을 빼면
2,000 이 남으므로 2009-10-01 날짜부터 2,000 원이 외상으로 넘어 온 것으로 확인 할 수 있는 것입니다.
4  COMMENTS
  • Profile
    땅콩맨 2010.04.02 03:15
    날짜와 날짜간에 금액계산이 연관되어서 계속 이루어져야하기 때문에
    마지막 결제일이란 항목도 필요할 것 같고요.

    마지막결제일을 알아야 그전에 외상지은날이 언제인지도 파악될 수 있을것같고요.
  • Profile
    phono 2010.04.02 18:29
    많은 분들이 미수금(미지급금) 처리를 위해
    입금, 매출(매입)을 분리 해서 처리 하는 경향이 있더군요.

    이렇게 되면 나중에 미수금 처리를 위한 쿼리 작성을 위한 SQL문 작성시 많은 제약이 따르게 되는데요..

    저는 미수금 처리를 위해 딱 두개의 테이블만 가져가게 합니다.


    년도+고객별 미수(미지급) 마감 테이블, 과 매출(매입) 테이블.

    입금은 매출(매입) 테이블에 필드를 하나 더 두어 처리를 하고요.
    왜냐면 입금이 매출과 같이 함께 발생하는 경우도 있을 것이고, 입금만 있는 경우도 있기 때문입니다.

    입금만 있는 경우는 매출의 디테일 쪽에는 품목코드테이블의 0번을 자동으로 등록토록 해서 처리를 해주고..
    품목코드 관리쪽에서는 코드 0번 의 용도를 '입금(지급)액 처리' 라는 항목으로 아예 고정설정해두고 사용자에 의해 삭제를 못하도록 설정해 버립니다.

    이렇게 되면.., SQL문 작성시 많은 이점이 있습니다.


    간단한 예를 들어 드리자면..


    년간 거래처별 미수금, 미지급금 마감 테이블

    (
    년도 VARCHAR(4) NOT NULL, /* 년도 */
    거래처번호 NUMERIC(7) NOT NULL, /* 관리번호 */
    /*------------- 매입부분 ------------*/
    당해년도 매입액 NUMERIC(16,2) DEFAULT 0, /* 당해년도 매입액 */
    당해년도 지급액 NUMERIC(16,2) DEFAULT 0, /* 당해년도 지급액 */
    당해년도 미지급액 NUMERIC(16,2) DEFAULT 0, /* 당해년도 미지급액 */
    /*------------- 매출부분 ------------*/
    당해년도 매출액 NUMERIC(16,2) DEFAULT 0, /* 당해년도 매출액 */
    당해년도 입금액 NUMERIC(16,2) DEFAULT 0, /* 당해년도 입금액 */
    당해년도 미수액 NUMERIC(16,2) DEFAULT 0, /* 당해년도 미수액 */
    CONSTRAINT 미수미지급테이블명_PK PRIMARY KEY (년도, 거래처번호)
    );



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


    매출(매입) 쪽 마스터/디테일은


    매출(매입) 마스터

    전표번호 VARCHAR(15) NOT NULL, /* 전표번호 - 거래년월일 8자리 + 일련번호 7자리 */
    거래구분 VARCHAR(1) NOT NULL, /* '0' 매출 '1' 매입 */
    거래유형구분 VARCHAR(1) DEFAULT '', /* 매입/매출 유형 구분 (예비) */
    거래일자 VARCHAR(8) DEFAULT '', /* 거래일자 */
    거래처번호 NUMERIC(7), /* 거래처 */
    /*-------------------------------------------------------------------------------*/
    명세총액 NUMERIC(14,2) DEFAULT 0, /* 명세총액 */
    입금총액 NUMERIC(14,2) DEFAULT 0, /* 매출시는 입금액, 매입시는 지급액 */

    CONSTRAINT 매출(매입)테이블명_PK PRIMARY KEY (전표번호, 거래구분)





    매출(매입) 디테일



    전표번호 VARCHAR(15) NOT NULL, /* 전표번호 - 거래년월일 8자리 + 일련번호 7자리 */
    거래구분 VARCHAR(1) NOT NULL, /* '0' 매출 '1' 매입 */
    일련번호 NUMERIC(3) NOT NULL, /* 일련번호 */
    반품여부필드 NUMERIC(1) DEFAULT 0, /* 반품 여부 0 정상 1 반품 */
    품목코드 NUMERIC(7), /* 품목코드 */
    규격 VARCHAR(40) DEFAULT '', /* 규격 */
    수량 NUMERIC(9,2) DEFAULT 0, /* 수량 */
    단가 NUMERIC(12,2) DEFAULT 0, /* 단가 */
    금액 NUMERIC(13,2) DEFAULT 0, /* 매입단가 */
    비고 VARCHAR(20) DEFAULT '', /* 비고 */
    과세면세구분 NUMERIC(1) DEFAULT 0, /* 과세,면세여부 여부 0 과세 1 면세 */

    CONSTRAINT 매출(매입)디테일테이블명_PK PRIMARY KEY (전표번호,거래구분,일련번호)





    식 입니다...
  • Profile
    phono 2010.04.02 18:40
    그리고 이러한 구조의 테이블 기준으로 해서 거래 이력을 생성해주면..


    사용자로 부터 입력받는 값은

    거래구분유형: 매입/매출
    기간: 년월일~ 년월일
    거래처코드:

    소트기준은 최근 전표번호순으로..,

    로 설정시..

    -----------------------------------------------------------------------------------------------------------
    거래처 거래일 전표번호 이전미수금 명세총액 입금액 미수금액
    ------------------------------------------------------------------------------------------------------------
    홍길동상회 20100402 201004020001 5000 1000 1000 5000
    홍길동상회 20100328 201003280011 2000 3000 0000 5000
    홍길동상회 20100310 201003100002 0000 4000 2000 2000
    .
    .
    .
    .
    .
    .




    이런식으로도 처리가 됩니다.
  • Profile
    땅콩맨 2010.04.03 04:12

    phono님 명쾌하게 답변을 해주셨네요.
    phono님 답변에 비추어보면
    lee, js님이 설계하신 DB구조는 좀 내용이 많이부족했듯싶네요

    phono님 답변을 보니깐 제가 한 답변이 너무 초라해지는건 뭘까요? ^^;;
    • lee, js
    • 2010.04.08 02:30
    • 5 COMMENTS
    • /
    • 0 LIKES
    • phono
      2010.04.08 08:16
      WITH구분이 가상테이블을 만들어 다시 셀렉트 하거나, INSERT도 되는 기능을 구현 한것 같은데.. 제가 ...
    • lee, js
      2010.04.08 20:23
      제가 with문을 사용한 것은 phono 님 말대로 sql문의 간소화를 위해 가상의 외상테이블과 현잔액 테이블...
    • phono
      2010.04.09 07:59
      일단 뽑아 낼수 없느냐 있느냐를 떠나.. 일단 이러한 구조가 어떠한 업무를 처리하는데 왜 필요한...
    • 땅콩맨
      2010.04.12 04:52
      lee, js님의 업무에 대한 추가적인 부연설명도 뒷따라야 할것같습니다
    • 성더기
      2010.04.12 20:19
      SQL만 가지고는 해결이 불가능할거 같네요 DBMS가 MS-SQL 이라면 프로시저나 function으로 처리가 가능...
    • Atom
    • 2010.04.06 20:24
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2010.04.06 20:36
      array[0..9] of PChar 는 씨로 말하면 char *가 10개 있는 배열입니다. Info_partNum: array[0..9] of P...
    • 땅콩맨
    • 2010.04.07 08:08
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 송동진
    • 2010.04.06 01:05
    • 8 COMMENTS
    • /
    • 0 LIKES
    • phono
      2010.04.06 01:30
      DB 엔진을 무엇을 쓰느냐에 따라 틀려지지요..
    • 송동진
      2010.04.06 01:52
      DB 는 파이어버드 2.0 입니다.
    • 땅콩맨
      2010.04.06 02:56
      INNER JOIN 방법을 사용하시면 될 듯 싶습니다. INNER JOIN(내부조인)은 각 테이블에서 비교 연사자에...
    • phono
      2010.04.06 08:56
      이너 조인이 아닌 아웃터 조인을 하세요.. 아웃터 조인은 두 테이블중 어느 한테이블에 자료가 존재하...
    • 성더기
      2010.04.07 02:45
      위의 경우라면 아우터 조인이 맞는거 같습니다. 아우터 조인을 하는 문법은 위 phono님께서 설명하신 것...
    • 송동진
      2010.04.07 05:43
      답변 감사합니다. 결과값 이 1 10 20100301 100 1 10 20100302 150 2 20 201...
    • 땅콩맨
      2010.04.07 07:59
      phono님이 위에 적으신대로 table B의 값을 번호별로 그룹핑하여 일자와 단가의 max값을 구하는 과정을 ...
    • • • •
    • 땅콩맨
      2010.04.04 21:07
      DB에서 값 Select하는 부분을 Loop로 돌려서 (이때 Richedit컨트롤을 메모리에 생성해서 Loop돌린갯수만...
    • 김영구
      2010.05.07 13:12
      시작부분이 ASCII 02번 () 이구요. 끝부분이 ASCII 03번 () 이네요. 시작과 끝 사이의 정보가 수신받...
    • 김정은
      2010.05.26 19:35
      (아스키2번 STX : 데이터 시작) ghgghg*^UU (아스키3번 ETX : 데이터 끝) *^UU -> 요 부분은 ...
    • 이용벽
    • 2010.04.03 10:22
    • 2 COMMENTS
    • /
    • 0 LIKES
    • phono
      2010.04.03 18:06
      서버측 프로그램이야 만들기 나름 아닐까요? 본래 서버라는 것은 "제공자"라는 의미로.. 클라이언트...
    • 땅콩맨
      2010.04.04 07:47
      P2P(Peer To Peer) 프로그램처럼 데이터를 받거나 보내는 기능 두가지를 원하시는건가요? 프루나같은 P2...
    • 강동엽
    • 2010.04.03 00:05
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 땅콩맨
      2010.04.03 07:14
      indy 컴포넌트를 설치하면서 버전정보를 인식하는부분에서 조금 다르게 인식한것같습니다. 라이브러리패...
    • 지환부
      2010.04.16 05:44
      indy 컴퍼넌트가 버전별 속성문제 인듯합니다. 버전이 업그레이드 될경우 하위 버전에있던 속성들이 변...
    • 서선영
    • 2010.04.02 21:04
    • 2 COMMENTS
    • /
    • 0 LIKES
    • phono
      2010.04.02 23:55
      1: String 타입으로 하시면 됩니다. 2: 해당데이터셋의 필드 에디터를 이용하셔서 데이터셋에 각각...
    • 땅콩맨
      2010.04.03 05:32
      phono님의 답변에 조금더 몇마디 덧붙이자면 (Dataset.FieldByName('yourDateFieldName) as TDateTimeFi...
    • lee, js
    • 2010.04.02 02:15
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 땅콩맨
      2010.04.02 03:15
      날짜와 날짜간에 금액계산이 연관되어서 계속 이루어져야하기 때문에 마지막 결제일이란 항목도 필요할 ...
    • phono
      2010.04.02 18:29
      많은 분들이 미수금(미지급금) 처리를 위해 입금, 매출(매입)을 분리 해서 처리 하는 경향이 있더군...
    • phono
      2010.04.02 18:40
      그리고 이러한 구조의 테이블 기준으로 해서 거래 이력을 생성해주면.. 사용자로 부터 입력받는 ...
    • 땅콩맨
      2010.04.03 04:12
      와 phono님 명쾌하게 답변을 해주셨네요. phono님 답변에 비추어보면 lee, js님이 설계하신 DB구조는 ...
    • lee, js
    • 2010.04.01 19:22
    • 4 COMMENTS
    • /
    • 0 LIKES
    • phono
      2010.04.01 19:52
      저는 ms-sql 7.0 이라.. 사이즈가 256이 한곈데, 요즘은 varchar가 4000 도 되는군요.. 일단 재고...
    • 땅콩맨
      2010.04.02 03:06
      그럼 phono님은 어떻게 처리하시는데요?
    • phono
      2010.04.02 18:07
      보통 저같은 경우는.. 품목별로 년 마감 테이블을 만들고.. 1년치 데이터는 전표에서 끌어오고 1년...
    • 땅콩맨
      2010.04.03 04:14
      아 테이블을 나눠서 처리가 되는거네요 그렇게되면 데이터관리하거나 처리할때 더 효과적이겠네요.
    • 배성철
    • 2010.04.01 13:54
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 땅콩맨
      2010.04.02 03:05
      예전에 영진출판사에서 발간된 Delphi Programming Bible이란 책이 있습니다. 이 책을 참고하시면 좀...
    • 한윤동
    • 2010.03.31 09:01
    • 6 COMMENTS
    • /
    • 0 LIKES
    • 땅콩맨
      2010.03.31 19:37
      Naver Window 7 카페에서 찾아보니 질문중 하나가 Program Files폴더가 2개가 존재하는데 무슨 문제가 ...
    • 한윤동
      2010.03.31 21:38
      네 그것을 저도 발견했는데요. program files(x86)이 32bit여서 그런 것 같습니다, 문제는 시스템이 받...
    • 박정순
      2010.03.31 22:30
      CDS.lpData 가 문자열 포인터를 가리키는 것 같은데...정적 배열로 사용하여 문자열을 배열에 복사하는 ...
    • 땅콩맨
      2010.04.01 05:14
      COPYDATASTRUCT cds; cds.dwData // 사용목적에 따른 식별값 cds.cbData; // 전달될 정...
    • 한윤동
      2010.04.02 07:50
      문제 찾았습니다..님들이 말씀해주신것을 참조해서 디버깅하다보니 문제가 GETOS 함수에 있네요 이 함...
    • 땅콩맨
      2010.04.03 04:07
      윤동님 올려주신 리플에 달린 소스를 살펴보니 lpData와 cbData순서가 바뀌었느데 이것도 문제가 되었...
    • lee, js
    • 2010.03.30 04:20
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 땅콩맨
      2010.03.30 06:26
      select 일자, 외상금액-입금 as Field2 from tbl order by 일자 desc 로 돌려서 찍어주면 되지 않을까요?
    • phono
      2010.03.30 19:18
      오라클과 MS-SQL을 쓰신다면 row-num과, decode(오라클사용시), case문(ms-sql 사용시) 을 이용하세...
    • shininggem
      2010.03.30 19:18
      설명만으론 쿼리를 구하기가 난해하네요. 테이블 구조를 알아야.... 일단 생각나는 방식은, 현재 잔...
    • phono
      2010.03.30 19:28
      외상금액 누적 처리는 날짜값을 기준으로 서브쿼리와 상관 서브쿼리를 이용하시고.. 이렇게 해서 ...
    • phono
      2010.03.28 21:54
      Screen.Cursor := crSQLWait; ... 쿼리 처리... Screen.Cursor := crDefault;
    • 박성훈
      2010.03.28 23:36
      try Screen.Cursor := crSQLWait; {Code for handling database here...} finally Sc...
    • 땅콩맨
      2010.03.29 02:55
      아, 지나가다 한수배우고 갑니다.
    • 조약돌
      2010.03.29 03:07
      답변 감사합니다. sql모래시계 커서 모양이 마음에 안들어서 윈도우에서 사용하는 모래시계 ...
    • 한윤동
    • 2010.03.28 08:01
    • 9 COMMENTS
    • /
    • 0 LIKES
    • 땅콩맨
      2010.03.28 09:03
      액세스가 거부되었다면 Registry경로가 잘못되었다는 이야기일텐데요? 소스상에 명시된 레지스트리 경로...
    • 한윤동
      2010.03.28 09:12
      경로는 이상이 없거든요.. 이게 XP에서는 전혀 이상이 없어여... Window7에서만 엑서스가 거부되는데요...
    • 땅콩맨
      2010.03.28 09:50
      보통 관리자 권한이 아닐때 발생되긴 하는데... 관리자 권한이 아닐리도 없을테구요 음. Windows7에 파...
    • 한윤동
      2010.03.28 10:24
      답변주셔서 감사합니다. 일단 Activex파일을 잘 열립니다,. openkkey()에서 오류가 나는 건데요... 다...
    • 땅콩맨
      2010.03.29 02:53
      Windows7하고 XP와는 많이 다를것입니다. API함수도 지원하는것도 있고, 다른 이름으로 변경된것도 있을...
    • 한윤동
      2010.03.29 21:17
      procedure TForm1.Button2Click(Sender: TObject); var LocalReg : TRegistry; AppRegPath : stri...
    • 한윤동
      2010.03.29 21:39
      //RootKey := HKEY_LOCAL_MACHINE; 를 풀어 RootKey := HKEY_LOCAL_MACHINE; 로 하면 하나도 안 읽혀여
    • • • •
    • 김선웅
    • 2010.03.27 08:10
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 땅콩맨
      2010.03.28 09:04
      uses 절에 SysConst를 선언해 주심됩니다.
    • 김정국
    • 2010.03.27 01:55
    • 8 COMMENTS
    • /
    • 0 LIKES
    • 김정국
      2010.03.27 02:04
      추가... 어찌어찌 하다가.. Conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data...
    • 땅콩맨
      2010.03.27 06:42
      파라독스 DB를 MSSQL등의 다른 DB형태로 포팅을 해보시는 방법도 고려해 볼 수 있지 않을까요?
    • phono
      2010.03.27 08:19
      ado를 사용해서 파라독스 db에 접근해야 할텐데요.. 아마 윈도우에서 기본적으로 제공되는 파라독스 db...
    • 김정국
      2010.03.27 17:45
      아...결국 안되는거군요...ㅠㅠ 한번만 열어 보려는건 아니구여...ㅠㅠ view.db에는 계속 적으로 ...
    • phono
      2010.03.27 21:28
      델파이툴에 보믄 데이터 펌프라는게 있습니다. 이걸 어디서 구할수 있다면.., 이걸로 일단 파라독스 ...
    • 땅콩맨
      2010.03.28 08:49
      ado로 해서.. 그 다음은 뭐죠? ㅋㅋ ^^ 정국님, phono님 말씀대로 포팅하는것도 한가지 방법입니다. ...
    • phono
      2010.03.28 10:21
      재개발 한다면 아마 정국님이 vb쪽이나 ms 쪽을 쓰고 있는 것 같으므로 델파이쪽도 ado를 이용해서 개...
    • • • •