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
운영게시판
최근게시물
Oracle Q&A 39689 게시물 읽기
No. 39689
주 단위 누적치 계산 방법???
작성자
누적계산
작성일
2012-10-17 00:35
조회수
5,742

안녕하세요?

제가 주 단위 누적치 계산(더하기, 빼기, 곱하기 등등)을 하고 있는데..

결과는 나오는데 좀 무식한 방법인것 같아서 다른 방법으로 표현 할수 있는 방법이 있나해서요..조언좀 얻을려 합니다.

WITH TEMP_TEST AS
(
  SELECT '001' CODE, 'TEST1' DESCT , '120' W40, '132' W41, '155' W42, '167' W43, '189' W44,
          '230278' STCK, '64869' OVERDUE_W40, '136274' OVERDUE_W41, '72485' OVERDUE_W42, '60063' OVERDUE_W43 FROM DUAL
  UNION ALL
  SELECT '002','TEST2', '342', '178', '122', '765', '669',
          '150', '34', '17', '58', '24' FROM DUAL
  UNION ALL
  SELECT '003', 'TEST3', '334', '987', '765', '343', '232',
          '180', '34', '231', '48', '34' FROM DUAL
  UNION ALL
  SELECT '004', 'TEST4', '234', '287', '565', '3403', '1232',
          '240', '34', '244', '38', '78' FROM DUAL
  UNION ALL
  SELECT '005', 'TEST5', '304', '907', '705', '393', '5232',
          '220', '34', '24', '28', '9' FROM DUAL
)
SELECT CODE, DESCT,
        (STCK - OVERDUE_W40) W40,
        (STCK - OVERDUE_W40 - OVERDUE_W41) W41,
        (STCK - OVERDUE_W40 - OVERDUE_W41- OVERDUE_W42) W42,
        (STCK - OVERDUE_W40 - OVERDUE_W41- OVERDUE_W42 - OVERDUE_W43) W43      
  FROM TEMP_TEST

위와 같이 주차에서 나온 값을 가지고 계산을 하고, 나온 값을 가지고 다음주차에 계산하고, 그 다음 또 그값을 가지고 계산하고....

주차가 늘어나면 위 같은 방법으로 계산면 되겠지만,,,,,, 무식한 방법 같습니다..

정녕 이런 방법 밖에 없는지 궁금합니다..

감사합니다.

 

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

우선 테이블이 주차가 늘어날때마다 컬럼이 늘어나는 형태가 아니라 로우가 늘어나는 형태로 되어 있어야 합니다..

 

테이블 구성을 컬럼이

CODE, DESCT, 주차, 값, OVERDUE_값

CODE, DESCT, STCK

이렇게 구성되도록 두개로 나눴구요..

 

이를 바탕으로 주어진 식대로 계산 하자면..

 

WITH V1 AS

(

  SELECT '001' CODE, 'TEST1' DESCT , 40 WEEK, 120 VAL, 64869 OVERDUE_VAL FROM DUAL

  UNION ALL

  SELECT '001' CODE, 'TEST1' DESCT , 41 WEEK, 132 VAL, 136274 OVERDUE_VAL FROM DUAL

  UNION ALL

  SELECT '001' CODE, 'TEST1' DESCT , 42 WEEK, 155 VAL, 72485 OVERDUE_VAL FROM DUAL

  UNION ALL

  SELECT '001' CODE, 'TEST1' DESCT , 43 WEEK, 167 VAL, 60063 OVERDUE_VAL FROM DUAL

  UNION ALL

  SELECT '001' CODE, 'TEST1' DESCT , 44 WEEK, 189 VAL, NULL OVERDUE_VAL FROM DUAL

  UNION ALL

  SELECT '002' CODE, 'TEST2' DESCT , 40 WEEK, 342 VAL, 34 OVERDUE_VAL FROM DUAL

  UNION ALL

  SELECT '002' CODE, 'TEST2' DESCT , 41 WEEK, 178 VAL, 17 OVERDUE_VAL FROM DUAL

  UNION ALL

  SELECT '002' CODE, 'TEST2' DESCT , 42 WEEK, 122 VAL, 58 OVERDUE_VAL FROM DUAL

  UNION ALL

  SELECT '002' CODE, 'TEST2' DESCT , 43 WEEK, 765 VAL, 24 OVERDUE_VAL FROM DUAL

  UNION ALL

  SELECT '002' CODE, 'TEST2' DESCT , 44 WEEK, 669 VAL, NULL OVERDUE_VAL FROM DUAL

  UNION ALL

  SELECT '003' CODE, 'TEST3' DESCT , 40 WEEK, 334 VAL, 34 OVERDUE_VAL FROM DUAL

  UNION ALL

  SELECT '003' CODE, 'TEST3' DESCT , 41 WEEK, 987 VAL, 231 OVERDUE_VAL FROM DUAL

  UNION ALL

  SELECT '003' CODE, 'TEST3' DESCT , 42 WEEK, 765 VAL, 48 OVERDUE_VAL FROM DUAL

  UNION ALL

  SELECT '003' CODE, 'TEST3' DESCT , 43 WEEK, 343 VAL, 34 OVERDUE_VAL FROM DUAL

  UNION ALL

  SELECT '003' CODE, 'TEST3' DESCT , 44 WEEK, 232 VAL, NULL OVERDUE_VAL FROM DUAL

  UNION ALL

  SELECT '004' CODE, 'TEST4' DESCT , 40 WEEK, 234 VAL, 34 OVERDUE_VAL FROM DUAL

  UNION ALL

  SELECT '004' CODE, 'TEST4' DESCT , 41 WEEK, 287 VAL, 244 OVERDUE_VAL FROM DUAL

  UNION ALL

  SELECT '004' CODE, 'TEST4' DESCT , 42 WEEK, 565 VAL, 38 OVERDUE_VAL FROM DUAL

  UNION ALL

  SELECT '004' CODE, 'TEST4' DESCT , 43 WEEK, 3403 VAL, 78 OVERDUE_VAL FROM DUAL

  UNION ALL

  SELECT '004' CODE, 'TEST4' DESCT , 44 WEEK, 1232 VAL, NULL OVERDUE_VAL FROM DUAL

  UNION ALL

  SELECT '005' CODE, 'TEST5' DESCT , 40 WEEK, 304 VAL, 34 OVERDUE_VAL FROM DUAL

  UNION ALL

  SELECT '005' CODE, 'TEST5' DESCT , 41 WEEK, 907 VAL, 24 OVERDUE_VAL FROM DUAL

  UNION ALL

  SELECT '005' CODE, 'TEST5' DESCT , 42 WEEK, 705 VAL, 28 OVERDUE_VAL FROM DUAL

  UNION ALL

  SELECT '005' CODE, 'TEST5' DESCT , 43 WEEK, 393 VAL, 9 OVERDUE_VAL FROM DUAL

  UNION ALL

  SELECT '005' CODE, 'TEST5' DESCT , 44 WEEK, 5232 VAL, NULL OVERDUE_VAL FROM DUAL

)

, V2 AS

(

  SELECT '001' CODE, 'TEST1' DESCT, 230278 STCK FROM DUAL

  UNION ALL

  SELECT '002' CODE, 'TEST2' DESCT, 150 STCK FROM DUAL

  UNION ALL

  SELECT '003' CODE, 'TEST3' DESCT, 180 STCK FROM DUAL

  UNION ALL

  SELECT '004' CODE, 'TEST4' DESCT, 240 STCK FROM DUAL

  UNION ALL

  SELECT '005' CODE, 'TEST5' DESCT, 220 STCK FROM DUAL

)

SELECT CODE

     , DESCT

     , WEEK

     , STCK - RESUTL

FROM  (

        SELECT V1.CODE

             , V1.DESCT

             , V1.WEEK

             , V1.VAL

             , V1.OVERDUE_VAL

             , V2.STCK

             , SUM(V1.OVERDUE_VAL) OVER(PARTITION BY V1.CODE ORDER BY V1.WEEK) RESUTL

        FROM   V1

             , V2

        WHERE  V1.CODE = V2.CODE

        AND    V1.DESCT = V2.DESCT

        AND    V1.OVERDUE_VAL IS NOT NULL

      )

 

근데 질문 상단에 더하기, 빼기, 곱하기 등등 다른 연산을 한다고 하셨는데..

누적합을 가지고 연산을 하는거는 가능하지만 누적차, 누적곱 등을 구하는건 위와같은 방법으로 해결 안될 수 있습니다..

PL/SQL이나 로직단에서 풀어야 할듯..

 

햇살한조각님이 2012-10-17 11:35에 작성한 댓글입니다. Edit

매번 감사합니다..

그러면 차주가 고정(4주나, 8주나, 16주) 되어 있고, STCK 정보 가  한 row로 table에 저장 되어 있다면, 한 row로 표현이 가능 할까요? (계산 할수 있는 DATA가 정보 존재시)

code | desc  | w40 | w41| w42| w43| w44|  RESUTL|

이런 형태로는 불가능 할까요?

 

누적계산님이 2012-10-17 23:11에 작성한 댓글입니다. Edit

혹시 이걸 원하시는건지??

질문 내용이 이해가 잘 안가네요..

 

 SELECT CODE

     , DESCT
     , MAX(CASE WHEN WEEK = 40 THEN RESULT ELSE NULL END) W40
     , MAX(CASE WHEN WEEK = 41 THEN RESULT ELSE NULL END) W41
     , MAX(CASE WHEN WEEK = 42 THEN RESULT ELSE NULL END) W42
     , MAX(CASE WHEN WEEK = 43 THEN RESULT ELSE NULL END) W43
FROM  (
        SELECT CODE
             , DESCT
             , WEEK
             , VAL
             , OVERDUE_VAL
             , STCK - RESUTL RESULT
        FROM  (
                SELECT V1.CODE
                     , V1.DESCT
                     , V1.WEEK
                     , V1.VAL
                     , V1.OVERDUE_VAL
                     , V2.STCK
                     , SUM(V1.OVERDUE_VAL) OVER(PARTITION BY V1.CODE ORDER BY V1.WEEK) RESUTL
                FROM   V1
                     , V2
                WHERE  V1.CODE = V2.CODE
                AND    V1.DESCT = V2.DESCT
                AND    V1.OVERDUE_VAL IS NOT NULL
              )
      )
GROUP BY CODE, DESCT
ORDER BY CODE
 
햇살한조각님이 2012-10-18 10:54에 작성한 댓글입니다. Edit

정말 감사합니다..

진짜 저에게 햇살한조각 입니다.

다시 한번 감사드립니다..

 

 

누적계산님이 2012-10-18 21:58에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
39692db 백업/복구 명령어 문의.
김삼
2012-10-19
4305
39691pro [테이블명]; [1]
이경일
2012-10-18
4080
39690날짜 기간(일수) 구하는 쿼리 도움 부탁드립니다. [2]
Jacob
2012-10-18
5937
39689주 단위 누적치 계산 방법??? [4]
누적계산
2012-10-17
5742
39688tablespace 일별/시간별 총사용량 구하기 질문 ㅠ [1]
DB초보사람
2012-10-16
6223
39687ORA-01843 재질문 ㅠ.ㅠ [1]
해외
2012-10-13
5104
39686문자열을 분리해서 종으로 표시하고 싶습니다. [2]
이병국
2012-10-12
4857
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다