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 39004 게시물 읽기
No. 39004
전체의 값에서 나눌때 반올림시 숫자를 정확히 맞추기
작성자
윤명철(nidty)
작성일
2011-10-25 09:51
조회수
4,302

그룹별 개수에서  나눗셈등이 일어났을때 반올림시 아래와 같이 KY 가 A인 경우는 0.1이라는 숫자가 소실되는 경우가 있습니다.

개발자 입장에서는 반올림이라는 특성으로 당연한 결과이지만 이걸 맞춰줘야 되는경우도 있더군요.

이경우 마지막 에서 33.4가 되게 할수 있는 방법이 있는지 궁금합니다.

고수님들 부탁드립니다.

쿼리 ------------------------------------------

SELECT KY
      ,DIV
      ,ORD_DT
      ,REL_DT
      ,COUNT(*) OVER(PARTITION BY KY)    AS GROUP_COUNT-- 그룹별 개수
      ,SUM(ORD_DT) OVER(PARTITION BY KY) AS GROUP_SUM_ORD_DT -- 그룹별 합
      ,SUM(REL_DT) OVER(PARTITION BY KY) AS GROUP_SUM_REL_DT -- 그룹별 합
      ,ROUND((SUM(REL_DT) OVER(PARTITION BY KY)
              - SUM(ORD_DT) OVER(PARTITION BY KY)
             ) /  COUNT(*) OVER(PARTITION BY KY)
            ,1) AS DISTRI  -- 차이 배분
  FROM(
        SELECT 'A' AS KY , 'A1' AS DIV, 150 AS ORD_DT, 200 AS REL_DT FROM DUAL UNION ALL
        SELECT 'A' AS KY , 'A2' AS DIV, 120 AS ORD_DT, 150 AS REL_DT FROM DUAL UNION ALL
        SELECT 'A' AS KY , 'A3' AS DIV, 150 AS ORD_DT, 170 AS REL_DT FROM DUAL UNION ALL
        SELECT 'B' AS KY , 'B1' AS DIV, 150 AS ORD_DT, 160 AS REL_DT FROM DUAL UNION ALL
        SELECT 'B' AS KY , 'B2' AS DIV, 120 AS ORD_DT, 130 AS REL_DT FROM DUAL
      )
 

결과 --------------------------

KY DIV ORD_DT REL_DT GROUP_COUNT GROUP_SUM_ORD_DT GROUP_SUM_REL_DT DISTRI

A   A1   150 200   3   420   520   33.3
A   A2   120 150   3   420   520   33.3
A   A3   150 170   3   420   520   33.3
B   B1   150 160   2   270   290   10
B   B2   120 130   2   270   290   10
 

원하는 결과 -------------

A   A1   150 200   3   420   520   33.3
A   A2   120 150   3   420   520   33.3
A   A3   150 170   3   420   520   33.4
B   B1   150 160   2   270   290   10
B   B2   120 130   2   270   290   10
 

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

이해가 안됩니다. 

(520-420)/3 = 33.33333333

KY가 A인 파티션은 모두 이 계산식입니다. 

 

cReAm(catz)님이 2011-10-26 11:24에 작성한 댓글입니다.

WITH t AS
(
SELECT 'A' ky , 'A1' div, 150 ord_dt, 200 rel_dt FROM dual
UNION ALL SELECT 'A', 'A2', 120, 150 FROM dual
UNION ALL SELECT 'A', 'A3', 150, 170 FROM dual
UNION ALL SELECT 'B', 'B1', 150, 160 FROM dual
UNION ALL SELECT 'B', 'B2', 120, 130 FROM dual
)
SELECT ky
     , div
     , ord_dt
     , rel_dt
     , group_count
     , group_sum_ord_dt
     , group_sum_rel_dt
     , DECODE(rn, 1
     , group_sum - ROUND(group_avg, 1) * (group_count - 1)
     , ROUND(group_avg, 1)
     ) AS distri
  FROM (SELECT ky
             , div
             , ord_dt
             , rel_dt
             , COUNT(*)    OVER(PARTITION BY ky) AS group_count
             , SUM(ord_dt) OVER(PARTITION BY ky) AS group_sum_ord_dt
             , SUM(rel_dt) OVER(PARTITION BY ky) AS group_sum_rel_dt
             , SUM(rel_dt - ord_dt) OVER(PARTITION BY ky) AS group_sum
             , AVG(rel_dt - ord_dt) OVER(PARTITION BY ky) AS group_avg
             , ROW_NUMBER() OVER(PARTITION BY ky ORDER BY div DESC) AS rn
          FROM t
        )
 ORDER BY ky, div
;

마농(manon94)님이 2011-10-26 16:02에 작성한 댓글입니다.

앗 답변 감사합니다. ~~

도저히 불가능해보이던게 가능하군요 ~

윤명철(nidty)님이 2011-10-27 09:44에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
39007위아래 값을 1개열로 만들기가 가능한가요? [2]
이태규
2011-10-26
3872
39006테이블 조인하여 UPDATE [1]
질문
2011-10-25
4399
39005select 한 날자값(300개) 가로 출력 [3]
강영호
2011-10-25
5199
39004전체의 값에서 나눌때 반올림시 숫자를 정확히 맞추기 [3]
윤명철
2011-10-25
4302
38999연속된값들의 갯수세기 [5]
이인호
2011-10-24
7461
38998프로시저안에서 원격지 프로시저를 호출할수 있나요? [2]
박주영
2011-10-24
4067
38997UI에 쿼리 결과 뿌릴때 결과 건수를 함께 ? [3]
궁금이
2011-10-24
3814
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.016초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다