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 40255 게시물 읽기
No. 40255
계산식 쫌 봐주세여
작성자
이선영
작성일
2013-09-11 11:39ⓒ
2013-09-12 09:35ⓜ
조회수
6,684

WITH TEST AS(
/*INVEN:100*/
SELECT 'REQ' CATE , 1000 TW1,1600 TW2,800 TW3 ,1000 TW4,1000 TW5,1200 W1,1200 W2,1200 W3 ,1200 W4,1200 W5
  FROM DUAL
)
SELECT 'REQ' CATE,TW1 W1,TW2 W2,TW3 W3,TW4 W4 ,TW5 W5 FROM TEST UNION ALL
SELECT 'CUMSUM' CATE,W1,W2,W3,W4,W5 FROM TEST UNION ALL
SELECT 'DIFF' CATE,W1-TW1 W1,W2-TW2 W2,W3-TW3  W3,W4-TW4 W4,W5-TW5 W5 FROM TEST

 

CATE  W1   W2    W3   W4    W5

REQ  1000  1600  800 1000 1000

CUMSUM 1200 1200 1200 1200 1200

DIFF 200   -400  400    200   200  200

APP  200    0        400   600  800  1000

제가 구하고 싶은 APP인데여.. DIFF값이 -면 0처리하고 그 다음 주차는 그 주차 DIFF고  0 아니면 그전주차를 더해주는 방식이예여.

0이라는 변수가 없으면 그냥 DIFF를 SUM하면 될꺼 같은데..0이란 처리때문에 너무 헷갈리네여.. 고수님들 부탁드려요.

 

이 글에 대한 댓글이 총 3건 있습니다.
SELECT DECODE(lv, 1, 'REQ', 2, 'CUMSUM', 3, 'DIFF', 4, 'APP') cate
     , DECODE(lv, 1, TW1, 2, W1, 3, W1-TW1, 4
     , GREATEST(W1-TW1, 0)) w1
     , DECODE(lv, 1, TW2, 2, W2, 3, W2-TW2, 4
     , GREATEST(GREATEST(W1-TW1,0)
                        +W2-TW2, 0)) w2
     , DECODE(lv, 1, TW3, 2, W3, 3, W3-TW3, 4
     , GREATEST(GREATEST(GREATEST(W1-TW1,0)
                                 +W2-TW2, 0)
                                 +W3-TW3, 0)) w3
     , DECODE(lv, 1, TW4, 2, W4, 3, W4-TW4, 4
     , GREATEST(GREATEST(GREATEST(GREATEST(W1-TW1,0)
                                          +W2-TW2, 0)
                                          +W3-TW3, 0)
                                          +W4-TW4, 0)) w4
     , DECODE(lv, 1, TW5, 2, W5, 3, W5-TW5, 4
     , GREATEST(GREATEST(GREATEST(GREATEST(GREATEST(W1-TW1,0)
                                                   +W2-TW2, 0)
                                                   +W3-TW3, 0)
                                                   +W4-TW4, 0)
                                                   +W5-TW5,0 )) w5
  FROM test
     , (SELECT LEVEL lv 
          FROM dual 
       CONNECT BY LEVEL <= 4) d
 ORDER BY lv

 

 
아린(arin76)님이 2013-09-11 14:05에 작성한 댓글입니다.
이 댓글은 2013-09-11 15:18에 마지막으로 수정되었습니다.

 SELECT *

  FROM (SELECT *
          FROM (SELECT lv, req, cumsum, diff, app
                  FROM (SELECT lv
                             , DECODE(lv, 1,TW1 , 2,TW2 , 3,TW3 ,4 ,TW4 , 5,TW5
                                        , 6,TW6 , 7,TW7 , 8,TW8 ,9 ,TW9 ,10,TW10
                                        ,11,TW11,12,TW12,13,TW13,14,TW14,15,TW15
                                        ,16,TW16,17,TW17,18,TW18,19,TW19,20,TW20) req
                             , DECODE(lv, 1,W1 ,2 ,W2 ,3 ,W3 , 4,W4 , 5,W5
                                        , 6,W6 ,7 ,W7 ,8 ,W8 , 9,W9 ,10,W10
                                        ,11,W11,12,W12,13,W13,14,W14,15,W15
                                        ,16,W16,17,W17,18,W18,19,W19,20,W20) cumsum
                             , DECODE(lv, 1,W1-TW1  , 2,W2-TW2  , 3,W3-TW3  , 4,W4-TW4  , 5,W5-TW5
                                        , 6,W6-TW6  , 7,W7-TW7  , 8,W8-TW8  , 9,W9-TW9  ,10,W10-TW10
                                        ,11,W11-TW11,12,W12-TW12,13,W13-TW13,14,W14-TW14,15,W15-TW15
                                        ,16,W16-TW16,17,W17-TW17,18,W18-TW18,19,W19-TW19,20,W20-TW20) diff
                          FROM test
                             , (SELECT LEVEL lv 
                                  FROM dual
                               CONNECT BY LEVEL <= 20) d
                        )        
                 MODEL
                 DIMENSION BY (lv)
                 MEASURES(req, cumsum, diff, 0 app)
                 IGNORE NAV
                 RULES AUTOMATIC ORDER
                 (app[ANY] = CASE WHEN diff[CV()] < 0 THEN 0 ELSE GREATEST(0, app[CV()-1] + diff[CV()]) END )
                 ORDER BY lv
                )
        UNPIVOT (val FOR str IN (req, cumsum, diff, app))   
        )
 PIVOT(MIN(val) FOR lv IN(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20))
 ORDER BY DECODE(str, 'REQ', 1, 'CUMSUM', 2, 'DIFF', 3, 'APP', 4)
아린(arin76)님이 2013-09-11 15:42에 작성한 댓글입니다.
이 댓글은 2013-09-11 15:43에 마지막으로 수정되었습니다.

WITH test AS
(
/*INVEN:100*/
SELECT 'REQ' cate
     , 1000 tw1, 1600 tw2,  800 tw3, 1000 tw4, 1000 tw5
     , 1200  w1, 1200  w2, 1200  w3, 1200  w4, 1200  w5
  FROM dual
)
, tmp AS
(
SELECT w
     , r req
     , c custom
     , d diff
     , SUM(d_) OVER(PARTITION BY p ORDER BY w) app
  FROM (SELECT w
             , r
             , c
             , c - r d
             , GREATEST(c - r, 0) d_
             , SUM(CASE WHEN c - r <= 0 THEN 1 END) OVER(ORDER BY w) p
          FROM (SELECT w
                     , DECODE(w, 1, tw1, 2, tw2, 3, tw3, 4, tw4, 5, tw5) r
                     , DECODE(w, 1,  w1, 2,  w2, 3,  w3, 4,  w4, 5,  w5) c
                  FROM test
                     , (SELECT LEVEL w FROM dual CONNECT BY LEVEL <= 5)
                )
        )
)
SELECT *
  FROM tmp
 UNPIVOT (v FOR cate IN (req, custom, diff, app))
 PIVOT (MIN(v) FOR w IN (1 w1, 2 w2, 3 w3, 4 w4, 5 w5))
 ORDER BY DECODE(cate, 'REQ', 1, 'CUSTOM', 2, 'DIFF', 3, 'APP', 4)
;

마농(manon94)님이 2013-09-13 14:06에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
402583~4일전 수정하기전 데이터를 확인할수 있을까요. [2]
새하정
2013-09-13
5985
40257부가세 계산 미치겠네요 [2]
질럿
2013-09-13
7157
40256문의드립니다. 중복건 [2]
새하정
2013-09-12
6169
40255계산식 쫌 봐주세여 [3]
이선영
2013-09-11
6684
40254날짜타입을 넣어야 하는데 초급이라 버겁습니다.도와주세요. [1]
DB란?
2013-09-11
5936
40253procedure 삭제 쿼리 질문입니다. [2]
우리누리
2013-09-10
6340
40252처음으로 글을 올립니다. 세로 data 가로 변형 [1]
안윤준
2013-09-10
6576
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다