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 40347 게시물 읽기
No. 40347
순차적으로 마이너스 또는 플러스 하는 방법
작성자
RN
작성일
2013-12-23 16:00ⓒ
2013-12-23 16:34ⓜ
조회수
8,196

RN 총합 가중치 가중치적용 반올림 원하는결과
1 40 1 4.761904762 5 4
2 40 0.6 2.857142857 3 2
3 40 1 4.761904762 5 5
4 40 1 4.761904762 5 5
5 40 0 0 0 0
6 40 1 4.761904762 5 5
7 40 1 4.761904762 5 5
8 40 1 4.761904762 5 5
9 40 0 0 0 0
10 40 0.6 2.857142857 3 3
11 40 0.6 2.857142857 3 3
12 40 0.6 2.857142857 3 3
    8.4   42 40

총합에 가중치를 적용하여 반올림을 해서 다시 SUM을 하면 42가 나옵니다

이걸 첫번째 로우부터 순차적으로 -1을 하여 총합이 40이 되도록 쿼리로 가능할까요?

 만일 반올림한 총합이 40보다 적을경우 순차적으로 더하기도 가능하도록 부탁드립니다.


SELECT 1 RN, 40 TOT,  1 POINT,  4.761904762 DIV_POINT, 5 R_POINT FROM DUAL
UNION ALL SELECT 2, 40, 0.6, 2.857142857, 3 FROM DUAL
UNION ALL SELECT 3, 40, 1, 4.761904762, 5 FROM DUAL
UNION ALL SELECT 4, 40, 1, 4.761904762, 5 FROM DUAL
UNION ALL SELECT 5, 40, 0, 0, 0 FROM DUAL
UNION ALL SELECT 6, 40, 1, 4.761904762, 5 FROM DUAL
UNION ALL SELECT 7, 40, 1, 4.761904762, 5 FROM DUAL
UNION ALL SELECT 8, 40, 1, 4.761904762, 5 FROM DUAL
UNION ALL SELECT 9, 40, 0, 0, 0 FROM DUAL
UNION ALL SELECT 10, 40, 0.6, 2.857142857, 3 FROM DUAL
UNION ALL SELECT 11, 40, 0.6, 2.857142857, 3 FROM DUAL
UNION ALL SELECT 12, 40, 0.6, 2.857142857, 3 FROM DUAL

 

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

반올림해도 1자리 -1 ~ 1 사이라는것을 기준으로

 

SELECT t.*

, 반올림

+ DECODE ( SIGN ( SUM (반올림) OVER ( ORDER BY RN DESC )

+ LEAD (반올림) OVER ( ORDER BY RN DESC )

- SUM (반올림) OVER ()

)

, -1

, 0

, -1

)

FROM t

채용근(taiji97)님이 2013-12-23 16:16에 작성한 댓글입니다.
이 댓글은 2013-12-23 16:17에 마지막으로 수정되었습니다.

답변 너무 감사합니다.
 

만일 반올림한 총합이 40보다 적을경우 순차적으로 더하기도 가능하도록 부탁드려도 될까요..

RN님이 2013-12-23 16:38에 작성한 댓글입니다. Edit

SELECT a.*

, CASE WHEN rnt <= ABS ( addCol ) AND addCol < 0

THEN 반올림 - 1

WHEN rnt <= ABS ( addCol ) AND addCol > 0

THEN 반올림 + 1

ELSE 반올림

END AA

FROM (

SELECT rn

, 총합

, 가중치

, 가중치적용

, 반올림

, 원하는값

, SUM(반올림) OVER() - 총합 AS addCol

, ROW_NUMBER() OVER ( ORDER BY rn ) AS rnt

FROM t

) a

채용근(taiji97)님이 2013-12-23 17:37에 작성한 댓글입니다.

SELECT rn, tot, point, div_point, r_point
     , r_point + CASE WHEN rn <= ABS(x) THEN SIGN(x) ELSE 0 END result
  FROM (SELECT rn, tot, point, div_point, r_point
             , tot - SUM(r_point) OVER() x
          FROM t
        )
;

마농(manon94)님이 2013-12-24 00:21에 작성한 댓글입니다.

답변 주신분께 정말 감사드립니다.

제가 빠뜨린 부분이 있는데 순차적으로 더하거나 뺄때 반올림결과가 0인경우는 스킵을 해야하구요..

마이너스는 순차적으로 빼는게 맞고 더할때는 역순으로 RN이 큰거부터 순차적으로 더해줘야 하는데

너무 복잡한가요.. 답변좀 꼭 부탁드려요..

 

RN님이 2013-12-24 08:25에 작성한 댓글입니다.
이 댓글은 2013-12-24 08:41에 마지막으로 수정되었습니다. Edit

SELECT rn, tot, point, div_point, r_point
     , r_point + CASE WHEN rn <= -x OR rd <= x THEN SIGN(x) ELSE 0 END r
  FROM (SELECT rn, tot, point, div_point, r_point
             , tot - SUM(r_point) OVER() x
             , ROW_NUMBER() OVER(ORDER BY rn DESC) rd
          FROM t
        )
 ORDER BY rn
;

마농(manon94)님이 2013-12-24 11:07에 작성한 댓글입니다.

답변 감사드립니다^^ 그런데 마농님께서 주신 쿼리를 적용하니 원하는 결과가 나오지 않아요..

SELECT rn, tot, point, div_point, r_point
     , r_point + CASE WHEN rn <= -x OR rd <= x THEN SIGN(x) ELSE 0 END r
  FROM (SELECT rn, tot, point, div_point, r_point
             , tot - SUM(r_point) OVER() x
             , ROW_NUMBER() OVER(ORDER BY rn DESC) rd
          FROM (
                SELECT 1 RN, 40 TOT,  1 POINT,  4.761904762 DIV_POINT, 5 R_POINT FROM DUAL
                UNION ALL SELECT 2, 40, 0.6, 2.857142857, 3 FROM DUAL
                UNION ALL SELECT 3, 40, 1, 4.761904762, 5 FROM DUAL
                UNION ALL SELECT 4, 40, 1, 4.761904762, 5 FROM DUAL
                UNION ALL SELECT 5, 40, 0, 0, 0 FROM DUAL
                UNION ALL SELECT 6, 40, 1, 4.761904762, 5 FROM DUAL
                UNION ALL SELECT 7, 40, 1, 4.761904762, 5 FROM DUAL
                UNION ALL SELECT 8, 40, 1, 4.761904762, 5 FROM DUAL
                UNION ALL SELECT 9, 40, 0, 0, 0 FROM DUAL
                UNION ALL SELECT 10, 40, 0.6, 2.857142857, 5 FROM DUAL
                UNION ALL SELECT 11, 40, 0.6, 2.857142857, 5 FROM DUAL
                UNION ALL SELECT 12, 40, 0.6, 2.857142857, 3 FROM DUAL)
        )
 ORDER BY rn;

실행을 하면 r 결과가 아래와 같이 나오는데 제가 원하는 결과는 r1입니다..

다시 부탁 좀 드리겠습니다.

r    r1

4   4
2   2
4   4
4   4
-1  0
4   4
5   4
5   5
0   0
5   5
5   5
3   3

RN님이 2013-12-24 11:27에 작성한 댓글입니다. Edit

음.. 중간에 0 을 간과했군요.

순차적으로 차감해 나간것인데 중간에 0을 만나 차감하니 -1 이 나온거네요.

혹시 중간에 1이 나온다면 어떻게 될까요?

1에서 1을 차감하면 0 이 될텐데...

이러면 실제 0인것과 1에서 차감되어 0인것이 구별이 안갈 수 있겠네요?

마농(manon94)님이 2013-12-24 11:33에 작성한 댓글입니다.
이 댓글은 2013-12-24 11:43에 마지막으로 수정되었습니다.

세심한 답변에 감사드립니다.

말씀하신데로 구별이 안되도 괜찮습니다.

다만 순차적으로 더하고 빼기 할때요..

더하기는 역순으로 빼기는 순차적으로 0을 만나면 스킵..이렇게만 되면 됩니다.

감사합니다^^

RN님이 2013-12-24 11:57에 작성한 댓글입니다. Edit

SELECT rn, tot, point, div_point, r_point
     , r_point + CASE WHEN r1 <= -x OR r2 <= x THEN SIGN(x) ELSE 0 END r
  FROM (SELECT rn, tot, point, div_point, r_point
             , tot - SUM(r_point) OVER() x
             , ROW_NUMBER() OVER(ORDER BY
               CASE WHEN r_point > 0 THEN rn END ASC  NULLS LAST) r1
             , ROW_NUMBER() OVER(ORDER BY
               CASE WHEN r_point > 0 THEN rn END DESC NULLS LAST) r2
          FROM t
        )
 ORDER BY rn
;

마농(manon94)님이 2013-12-24 12:23에 작성한 댓글입니다.

정확히 제가 원하는 결과입니다.

답변주신 두분 모두 정말 감사합니다.

많은 공부 되었습니다^^

RN님이 2013-12-24 13:01에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
40350pl/sql 플랜 볼수 있나요? [1]
김대윤
2013-12-26
6911
40349PL/SQL 에서 INDEX힌트 먹나요?
김대윤
2013-12-26
6665
40348ORA-01438 오류에 대해서(date타입) [4]
도와주세요
2013-12-26
7049
40347순차적으로 마이너스 또는 플러스 하는 방법 [11]
RN
2013-12-23
8196
40346바로 아랫글쓴사람인데..8.1.7깔고database폴더...
한상원
2013-12-23
6275
40345xp방화벽 설정하고 원격접속은..?
한상원
2013-12-20
6095
403448i -> 11g import 가능한가요?
김홍찬
2013-12-19
6283
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다