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
운영게시판
최근게시물
MS-SQL Q&A 1393 게시물 읽기
No. 1393
[질문]합계 값이 매번 바뀝니다...ㅠ.ㅠ 쿼리문이 이상한가요..?
작성자
정해원(substring)
작성일
2004-06-25 12:18ⓒ
2004-06-25 13:57ⓜ
조회수
3,429

여기 저기 검색하다 글이 없어서 이렇게 질문을 올립니다...

먼저 Table AA 는

aNum aName aSum
1 aa 0
2 bb 0
3 cc 0


그리고 Table BB는

aNum bVal bDate
1 100 2003-01-10
1 200 2003-02-10
1 300 2003-03-10
1 100 2003-04-10
2 200 2003-01-10
2 300 2003-02-10
2 400 2003-03-10
2 100 2003-04-10
2 200 2003-05-10
... ... ...


보시면 아시겠지만...

두번째 테이블에서 가져와야 할 값은 bDate 기준으로 bVal 가 꾸준히 증가하다가 다음 값이 감소할 경우

그 차이 값을 AA Table의 aSum에 누적시키는 것입니다...

게다가 두번째 테이블의 값이 1은 4행, 2는 5행 이런 식으로 일정하지 않습니다.

일단 제가 한 방법은 AA 테이블에 aa 를 추가한 다음

update를 써서

bVal의 값을 aa에 집어넣고 다음 bVal의 값과 비교해서 크면 집어넣고

작으면 그 차액을 aSum에 누적시키는 식으로 햇씁니다..

값을 누적시킨 다음 합계를 내봤는데...

문제는 돌릴 때마다 합계 값이 틀려진다는 것입니다...

제 추측으로는 아마도 두번째 테이블의 날짜가 낮은 날짜순으로 들어가지 않고...

무작위로 랜덤하게 들어가다 보니... 무조건 다음 행의 값이 자신보다 작게 되면 그 차액을 누적시키기는

것으로 생각이 됩니다...

그렇다고 기준을 날짜로 맞추어도 문제가 생기는 것으로 생각이 됩니다...

Update AA
Set aa = BB.bVal

From AA, BB
where AA.aNum = BB.aNum
and AA.aa < BB.bVal

Update AA
Set aSum = aSum + (aa - BB.bVal)
, aa = BB.bVal
From AA, BB
where AA.aNum = BB.aNum
and AA.aa > BB.bVal

이런식으로 구한 후에

Select Sum(aSum)

From AA

를 했더니 할 때마다 값이 틀려지는 것입니다...

실력도 없으면서 소스를 올리는 것이 너무 부끄럽지만...

도움을 바라는 마음에 올립니다..

고수님들의 가르침을 부탁드립니다....

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

차액에 대한 누적합계라고 해서

aa 테이블의 값이 현재는

anum = 1 은  asum = 200

anum = 2 은  asum = 300

이렇게 나와야 할것 같아 커서로 해보았읍니다.

 

그리고 올려주신 쿼리에서 문제는

누적합계와 bval 을 비교하던데

누적합계와 계속 변하는데 비교가 안될 것 같은데요.

 

declare @anum_01  int,
        @bval_01  int,
        @bdate_01 smalldatetime,
        @anum_02  int,
        @bval_02  int,
        @bdate_02 smalldatetime

declare c_t cursor for
select  anum,
        bval,
        bdate
  from  bb
order by
        anum,
        bdate

open c_t

fetch next from c_t into  @anum_01, @bval_01, @bdate_01
fetch next from c_t into  @anum_02, @bval_02, @bdate_02

while @@fetch_status = 0
begin
      if (@anum_01 = @anum_02 ) and (@bval_01 > @bval_02)
         update aa set asum = asum + (@bval_01 - @bval_02) where anum = @anum_01

      select @anum_01 = @anum_02, @bval_01 = @bval_02, @bdate_01 = @bdate_02

      fetch next from c_t into  @anum_02, @bval_02, @bdate_02
end

close c_t
deallocate c_t

go
select * from aa

t_1234님이 2004-07-01 10:16에 작성한 댓글입니다. Edit

 

답변 감사합니다... 많이 도움이 됐습니다...(__)
정해원(substring)님이 2004-07-09 09:26에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
1396FreeTDS ODBC 연결하는 법 가르쳐주세요
이대범
2004-06-27
2855
1395사용자정의 함수로 시작일 마지막일 알기 [1]
황대권
2004-06-25
3785
1394월초 월말 구하기 날짜 함수이용 [1]
황대권
2004-06-25
7621
1393[질문]합계 값이 매번 바뀝니다...ㅠ.ㅠ 쿼리문이 이상한가요..? [2]
정해원
2004-06-25
3429
1392[질문]쿼리문 좀 알려주세요. [1]
가우나라
2004-06-24
2602
1390제발 답변 좀...ㅜ.ㅜ
초보
2004-06-24
2526
1389SQL 백업파일 용량이 1G 를 넘어서서요 줄일수 있는 방법줌... [1]
초보 SQL
2004-06-23
3986
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다