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
운영게시판
최근게시물
PostgreSQL Q&A 7072 게시물 읽기
No. 7072
잔액 계산을 하는 쿼리 질문입니다.
작성자
가우나라(familyj)
작성일
2007-03-06 15:10
조회수
4,474

nNum, nMoney 라는 Integer 칼럼의 테이블이 있습니다.

여기에 데이터는

---------------------------
nNum  nMoney
---------------------------
1         100
2         200
3         300
4         500
5         800


이런식의 데이터가 들어 있다는 가정하에
---------------------------
nNum  nMoney  Sum
---------------------------
1         100   
2         200         300
3         300         600
4         500        1100
5         800        1900

라는 sum 의 항목을 만들고 싶습니다.
sum 의 항목은 이전 nMoney 의 합과 현재 레코드의 nMoney 의 합입니다.

위와 같은 쿼리를

Select nNum, nMoney, ( (Select sum(nMoney) From tbA as B Where B.nNum < A.nNum ) + nMoney ) as Sum From tbA A

라고 하면 되지만,
문제는 레코드가 100개가 넘기만 하면 시간을 예측할 수 없을정도로 느려집니다.

Sum 의 항목을 구할만한 쿼리를 어떻게 해야 할까요?

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

그래서, 그런 자료형은 테이블 설계에 '잔액' 이라는 항목을 둡니다. 


그래야, 기간별 그 현재 잔액을 쉽게 구하거든요. 

안그러면, 잔액 구하는 작업이 배치 처리 되지 않으면 안되거든요.

이 부분에 대한 이야기는 아랫글에서 자세히 언급하고 있습니다.


또 다른 방법은,

그저 간단하게, table return 함수로 풀 수도 있을 것 같은데, 

그럴려면, 일단 리턴 템플릿 빈 테이블 하나를 만들어야겠네요.


select * from addremainsum(tablename);


이런식이 되겠네요. 


addremainsum 함수의 리턴자료형은 아까 만든 템플릿 빈 테이블이 될터이고. 



테이블 리턴 함수에 대한 자세한 이야기는 이곳 게시판이나, 

PostgreSQL 설명서를 참조하시고.


의사코드


리턴할 레코드와 마지막 잔액 변수를 선언하고, 


select 를 출력 순서대로 정렬해서, 

하나씩 쭉 뽑아보면서 마지막 잔액에다가 현재 레코드의 금액을 더해서 잔액 칼럼에 넣어서 리턴


손 쉽게 풀어갈 수 있는 방법일터인데, 

점점 일이 복잡해져가면, 단순한 테이블 리턴 함수만으로 문제를 못 풀어가는게 

세상사더라구요.


시간이 많다면, 아래글을 참조 하셔서 칼럼하나를 두시는게 좋을겝니다. 


참, 잔액 칼럼이 생기면, 중간 자료가 바뀌거나 삭제되었을 경우, 그 이후 자료에 대한 모든 잔액을 고쳐야하는 아주 골치아픈 사태가 생기기도 합니다. 


알아서 잘!

김상기(ioseph)님이 2007-03-06 17:28에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
7075두 sql결과가 틀린 이유가 뭔지 혹시 아시나요? [1]
궁금이
2007-03-14
4199
7074날짜 조건 포함에 따른 속도 저하.. [2]
소심고양이
2007-03-12
5894
7073[급함]다시한번 질문 드립니다. [1]
나그네
2007-03-10
4137
7072잔액 계산을 하는 쿼리 질문입니다. [1]
가우나라
2007-03-06
4474
7071쿼리 질문입니다. [1]
조진우
2007-03-06
4575
7070PostgresSQL 7.3 -> 8.2.3 업그레이드 시 encoding error [1]
무적초보
2007-03-05
7380
7069트리거는 어떻게 해야하는지.. [1]
스치는인연
2007-03-02
4516
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.021초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다