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
운영게시판
최근게시물
DB2 Q&A 1511 게시물 읽기
No. 1511
db2 쿼리 질문....미치겠음 좀도와주삼
작성자
지창용
작성일
2008-02-11 15:15
조회수
10,307

SELECT
 '4' ORD, substr(a.acdate,0,7) ACDATE, '' REMARKS,
 '' GEORECODE,
 '누  계' NAME,
 A.ACCODE,
 B.CDNAME,
 (select SUM(dramt) FROM ACCOUNT.ACSLPLNT
  wHERE ACCODE BETWEEN 'A230500' AND 'A230500'
    AND ACDATE BETWEEN '20070000' AND 
(case substr(c.acdate,0,7) when '200701' then '20070131' <===요부분
                            when '200702' then '20070231'
                            when '200703' then '20070331'
                            when '200704' then '20070431'
                            when '200705' then '20070531'
                            when '200706' then '20070631'
                            when '200707' then '20070731'
                            when '200708' then '20070831'
                            when '200709' then '20070931'
                            when '200710' then '20071031'
                            when '200711' then '20071131'
                            when '200712' then '20071231'
   end)
) DRAMT,
FROM ACCOUNT.ACSLPLNT A
 WHERE A.ACDATE BETWEEN '20070101' AND '20071231'
  AND A.ACCODE BETWEEN 'A230500' AND 'A230500'
   AND A.STATS = '5'
 GROUP BY substr(a.acdate,0,7), A.ACCODE, B.CDNAME


회계의 누계를 내는 쿼리입니다.

위쿼리에서 <==요부분 이라고 명시되있는 조건절에

1월이면 between '20070000' and '20070131'
2월이면 between '20070000' and '20070231'

이런식으로 between두번째 자리에 값을 acdate의 달로 바꾸고 싶습니다.

현재 나오는 내용은 이렇게 나옵니다 

아래와같이 DRAMT부분이 동일한값이 나와서 문제입니다.
4 200703    누  계 A230500 토지 102468779000 
4 200704    누  계 A230500 토지 102468779000 
4 200705    누  계 A230500 토지 102468779000 
4 200712    누  계 A230500 토지 102468779000 
4 200711    누  계 A230500 토지 102468779000 

이거가지고 지금 고생이 이만저만이아닙니다

고수님들의 조언부탁드립니다......

설명력이 부족하여 이말저말 덧붙인거같네요 궁금한사항있으면 댓글달아주셍

부탁드립니다...!!!!!!

누계 너 가만안두겠어..ㅠㅠ

이 글에 대한 댓글이 총 3건 있습니다.
SELECT '4' ORD, ACDATE, '' REMARKS, '' GEORECODE, '누  계' NAME, ACCODE, CDNAME,
       case when rn=1 then sdr
            when rn=2 then sum(sdr) over(order by rn rows 1 preceding)  
            when rn=3 then sum(sdr) over(order by rn rows 2 preceding)
            when rn=4 then sum(sdr) over(order by rn rows 3 preceding)  
            when rn=5 then sum(sdr) over(order by rn rows 4 preceding)  
            when rn=6 then sum(sdr) over(order by rn rows 5 preceding)
            when rn=7 then sum(sdr) over(order by rn rows 6 preceding)
            when rn=8 then sum(sdr) over(order by rn rows 7 preceding)
            when rn=9 then sum(sdr) over(order by rn rows 8 preceding)
            when rn=10 then sum(sdr) over(order by rn rows 9 preceding) 
            when rn=11 then sum(sdr) over(order by rn rows 10 preceding)
            when rn=12 then sum(sdr) over(order by rn rows 11 preceding) end s_dramt
FROM (
SELECT substr(a.acdate,1,6) ACDATE, A.ACCODE, B.CDNAME, SUM(dramt) sdr,
       rownumber() over(partition by substr(a.acdate,1,6) order by substr(a.acdate,1,6)) rn
FROM ACCOUNT.ACSLPLNT A
 WHERE A.ACDATE BETWEEN '20070101' AND '20071231'
  AND A.ACCODE BETWEEN 'A230500' AND 'A230500'
   AND A.STATS = '5'
 GROUP BY substr(a.acdate,1,6), A.ACCODE, B.CDNAME
) t1;
벽타는 냥이님이 2008-02-12 10:11에 작성한 댓글입니다.
이 댓글은 2008-02-12 10:20에 마지막으로 수정되었습니다. Edit

참고하세요.

WITH
TEST_T(ILJA,AMT) AS (VALUES
('20070101',1),
('20070111',1),
('20070111',1),
('20070121',1),
('20070123',1),
('20070202',2),
('20070202',2),
('20070212',2),
('20070212',2),
('20070222',2),
('20070303',3),
('20070303',3),
('20070313',3),
('20070313',3),
('20070323',3),
('20071201',4),
('20071212',4),
('20071212',4),
('20071231',4),
('20071231',4)
)

SELECT  SUBSTR(YM,1,4) || MM   YM
      ,SUM(CASE WHEN SUBSTR(YM,5,2) <= MM THEN SAMT ELSE 0 END) SM
 FROM (
   SELECT  SUBSTR(ILJA,1,6) YM  ,SUM(AMT) SAMT
     FROM  TEST_T
    WHERE  ILJA LIKE '2007%'
 GROUP BY SUBSTR(ILJA,1,6)
   ) A ,TABLE(
   VALUES '01','02','03','04','05','06'
         ,'07','08','09','10','11','12') DUAL (MM)
GROUP BY  SUBSTR(YM,1,4) || MM
  HAVING  SUM(CASE WHEN SUBSTR(YM,5,2) = MM THEN SAMT ELSE 0 END) <> 0

결과
200701 5
200702 15
200703 30
200712 50

HAVING 을 제거한 결과
200701 5
200702 15
200703 30
200704 30
200705 30
200706 30
200707 30
200708 30
200709 30
200710 30
200711 30
200712 50

박진복(pjb708)님이 2008-02-12 13:15에 작성한 댓글입니다.
이 댓글은 2008-02-12 13:17에 마지막으로 수정되었습니다.

밑에 두분 글씨 잘봤는데요 첫번째분은 각월의 합계를 그냥 출력하신거같고


두번째분은 쿼리문에 무슨말씀이신지 모르겠음


table() dual(mm)


이렇게 적으셨는데 이부분은 뭘뜻하는건지 설명좀해주세요...

지창용님이 2008-02-25 09:33에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
1514로그인 시 사용자 제어 [1]
이도희
2008-02-12
8325
1513DB2 geometry 연산자를 표로 좀 구할수없을까요? [1]
진은수
2008-02-11
9024
1512중국어 관련 도와 주세요 [1]
손님
2008-02-11
10472
1511db2 쿼리 질문....미치겠음 좀도와주삼 [3]
지창용
2008-02-11
10307
1510쿼리가 안되는 테이블 [1]
김상출
2008-02-04
8717
1508자동 데이터베이스 백업 기능 [3]
또이
2008-01-31
10130
1507백업에 대해 질문 드립니다. [3]
또이
2008-01-30
8876
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.020초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다