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
운영게시판
최근게시물
MS-SQL Q&A 6762 게시물 읽기
No. 6762
소수점 이하 절삭 문의드립니다. (절삭된 값이 얼마인지 알수 있나?)
작성자
최보현(metalzang)
작성일
2013-11-20 14:49ⓒ
2013-11-20 14:50ⓜ
조회수
9,399

안녕하세요.

3개의 record가 있는데요. 각각

예를들어

1번 record 10.5
2번 record 10.5
3번 record 10.0

이럴때 1,2번은 소수점이하 원절삭을 하는데...이때...
원절삭한 값의 합을 3번 record에 더해줘야 합니다....

쿼리로 가능한 문제일까요? 한마디로 요약하면 절삭된 값을 알수가 있을지..
위 내용은 임의의 데이터로 가정을 한거고 값이 얼마가 될지는 모르는 상황이네요..
0.5가 될지 0.23이 될지 모르는...

고수님들의 답변좀 부탁드립니다.

감사합니다 ㅠ.ㅠ

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

DECLARE @sumFrac REAL
;
SELECT @sumFrac = SUM( val - FLOOR( val ) )
FROM tbl
WHERE seq <> 3
;
UPDATE tbl
SET val = val + @sumFrac
WHERE seq = 3
;
UPDATE tbl
SET val = FLOOR( val )
WHERE seq <> 3
;

 

위의 반전되어 보이는 부분처럼 떨어져 나갈 값을 구할 수 있습니다.

우욱님이 2013-11-21 09:11에 작성한 댓글입니다.
이 댓글은 2013-11-21 09:13에 마지막으로 수정되었습니다. Edit

우욱님 댓글 감사합니다.

그런데요 record가 3개가 있다고 가정한 경우인데...

혹시나 3개의 record가 아니라 몇개가 될지 모르는 상황이라면 어쩌면 좋을까요?

여러개 행중 가장 마지막 record를 제외한 나머지 행들의 원절삭한 값을

가장 마지막 record에 더해줘야 하는 상황인지라.....ㅠ.ㅠ

최보현(metalzang)님이 2013-11-21 09:53에 작성한 댓글입니다.

WITH t AS
(
SELECT 1 pk, 10.5 v
UNION ALL SELECT 2, 10.4
UNION ALL SELECT 3, 10.0
)
SELECT pk, v
     , ROUND(v, 0, 1)
     + CASE ROW_NUMBER() OVER(ORDER BY pk DESC)
       WHEN 1 THEN SUM(v%1) OVER() ELSE 0 END
       AS Result
  FROM t
 ORDER BY pk
;

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

 마농님 감사합니다~
누적 SUM() OVER()하나 배웠네용... 상황이 약간 달라서 응용하려고 했더니 어렵네요..ㅠ.ㅠ
데이터를 보여드렸어야 하는건데....

 

PK 금액 배율 금액*배율/100 ROW_ID 결과 소수점이하
절삭
 
1300002 45 30.000 13.500000 1 13.000000 0.5  
1300002 45 30.000 13.500000 2 13.000000 0.5  
1300002 45 25.000 11.250000 3 11.000000 0.25  
1300002 45 15.000 6.750000 4

6.750000

--> 8.000000

  PK에 해당되는 마지막 ROW_ID 이전 값들의 결과+소수점이하절삭값
그래서 결과는 "8"이어야 함
1300004 45 30.000 13.500000 1 13.000000 0.5  
1300004 45 40.000 18.000000 2 18.000000    
1300004 45 30.000 13.500000 3

13.500000

--> 14.000000

  PK에 해당되는 마지막 ROW_ID 이전 값들의 결과+소수점이하절삭값
그래서 결과는 "14"이어야 함
1300005 45 100.000 45.000000 1 45.000000    

 

아래와 같이 쿼리를 작성하다 도저히 답이 나오지 않아 문의드렸던건데.

답글 달아주신 내용 참고해서 해보려고 해도 원하는 결과가 나오지 않더군요...

도움 요청 드릴께요....

해당 테이블에 pk별로 seq(일련번호)가 없다보니 쿼리가 좀 지저분해졌네요....

 

SELECT

 

 CASE

WHEN ROW_ID < (

SELECT MAX(ROW_ID) FROM (

SELECT ROW_NUMBER()OVER(PARTITION BY A.PURP_SUPO_NO ORDER BY A.PURP_SUPO_NO) AS ROW_ID 

FROM MS_MASTER_PURPRSLT BB WHERE A.PURP_SUPO_NO = BB.PURP_SUPO_NO

AND A.MMNO = BB.MMNO

) AAA

)   THEN  ROUND(RATE_AMT,0,1)  

ELSE  RATE_AMT

END AS 원하는값

 FROM (

SELECT 

A.MMNO, 

A.PURP_SUPO_NO, 

A.AMT, 

B.RSLT_RATE, 

(A.AMT*B.RSLT_RATE)/100 AS RATE_AMT, ROW_NUMBER()OVER(PARTITION BY A.PURP_SUPO_NO ORDER BY A.PURP_SUPO_NO) AS ROW_ID

FROM MS_MASTER_PURPSUPO A

INNER JOIN MS_MASTER_PURPRSLT B ON A.PURP_SUPO_NO = B.PURP_SUPO_NO

WHERE A.MMNO = '13737360'

AND  IPAMT_MTHD IN ('A001', 'A002') -- 입금방법:MICR, OCR --> C033

AND PURP_SUPO_STOP_DT IS NULL -- 후원중지가 아닌경우

) A

GROUP BY MMNO, PURP_SUPO_NO, AMT, RSLT_RATE, RATE_AMT, ROW_ID

 

 

 

최보현(metalzang)님이 2013-11-21 12:05에 작성한 댓글입니다.

with temp01 (pk, amt, reduce, amtPerReduce, row_id, result, etc) as (

select '1300002', 45, 30.000, 13.500000, 1, 13.000000, 0.5 UNION ALL

select '1300002', 45, 25.000, 11.250000, 2, 11.000000, 0.5 UNION ALL

select '1300002', 45, 25.000, 11.250000, 3, 11.000000, 0.25 UNION ALL

select '1300002', 45, 15.000, 6.750000, 4, 6.750000, 0 UNION ALL

 

select '1300004', 45, 30.000, 13.500000, 1, 13.000000, 0.5 UNION ALL

select '1300004', 45, 40.000, 18.000000, 2, 18.000000, 0 UNION ALL

select '1300004', 45, 30.000, 13.500000, 3, 13.500000, 0

)

select

pk

, amt

, reduce

, amtPerReduce

, row_id

, case

when a.rn = 1 then isnull(result, 0) + isnull(etc_sum, 0)

else isnull(result, 0)

end as result

, etc

, etc_sum

from (

select

pk

, amt

, reduce

, amtPerReduce

, row_id

, result

, etc

, row_number() over (partition by pk order by row_id desc) as rn

, sum(etc) over (partition by pk) AS etc_sum

from temp01

) a

order by pk, row_id

건영31세님이 2013-11-21 15:06에 작성한 댓글입니다. Edit

-- 순방향 정렬해서 맥스값(?)을 찾으려 하지 말고
-- 역방향 정렬해서 1을 찾으세요.
SELECT a.*
     , CASE WHEN rn = 1
            THEN v + s
            ELSE v
        END AS 원하는값
  FROM
(
SELECT A.MMNO
     , A.PURP_SUPO_NO
     , A.AMT
     , B.RSLT_RATE
     , A.AMT*B.RSLT_RATE/100 AS RATE_AMT
     , FLOOR(A.AMT*B.RSLT_RATE/100) v
     , ROW_NUMBER() OVER(
       PARTITION BY A.PURP_SUPO_NO
       ORDER BY A.PURP_SUPO_NO DESC) rn
     , SUM((A.AMT*B.RSLT_RATE/100)%1) OVER(PARTITION BY A.PURP_SUPO_NO) s
  FROM MS_MASTER_PURPSUPO A
 INNER JOIN MS_MASTER_PURPRSLT B
    ON A.PURP_SUPO_NO = B.PURP_SUPO_NO
 WHERE A.MMNO = '13737360'
   AND IPAMT_MTHD IN ('A001', 'A002')  -- 입금방법:MICR, OCR --> C033
   AND PURP_SUPO_STOP_DT IS NULL  -- 후원중지가 아닌경우
) a
;

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

건영31세님.... 대박..
원하는 결과가 딱이네여~
사랑넷 님들 수준은 따라갈 수가 없어요...ㅠㅠ.

완전 감사합니다. (__)

최보현(metalzang)님이 2013-11-21 15:18에 작성한 댓글입니다.

마농님의 쿼리는 항상 뭔가를 생각하게 만드는...완전 감사합니다 ㅠ.ㅠ

먼저 답변 주신 "건영31세"님 의견 참고해서 작성하긴 했는데...
마농님 쿼리 보고 궁금한게 있는데요...

근데 case when rn = 1
                   then  v + s
                   else v
         end as 원하는 값에서..

서브 쿼리에서 역순으로 정렬하여
마지막 select 절에서 rn=1으로 인해서 마지막행에 sum을 넣어야 하는데..
row_id의 첫번째 행에 sum이 되는 효과가...

1300002의 경우에는 rn=4에 누적이 되어야 하고,
1300004의 경우에는 rn=3에 누적이 되어야 하는데...
 

PURP_SUPO_NO AMT RSLT_RATE RATE_AMT v rn s 원하는값
1300002 45 30.000 13.500000 13 1 2.000000 15
1300002 45 30.000 13.500000 13 2 2.000000 13
1300002 45 25.000 11.250000 11 3 2.000000 11
1300002 45 15.000 6.750000 6 4 2.000000 6
1300004 45 30.000 13.500000 13 1 1.000000 14
1300004 45 40.000 18.000000 18 2 1.000000 18
1300004 45 30.000 13.500000 13 3 1.000000 13
1300005 45 100.000 45.000000 45 1 0.000000 45

 

 

최보현(metalzang)님이 2013-11-21 15:51에 작성한 댓글입니다.

rn 을 만드실때 ASC 정렬을 하셔서 그렇죠

DESC 정렬을 하시면 1번이 마지막 데이터죠.

혹시 정렬하실거면 맨 마지막에 정렬하시면 됩니다.

ORDER BY pk, rn DESC

마농(manon94)님이 2013-11-21 16:31에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
6765컬럼명 바꾸기 [2]
김우성
2013-11-25
7592
6764저장프로시저로 테이블 및 뷰 생성하기 [2]
윤동희
2013-11-25
9553
6763SQLCMD에 관하여 [1]
궁금이
2013-11-21
7539
6762소수점 이하 절삭 문의드립니다. (절삭된 값이 얼마인지 알수 있나?) [9]
최보현
2013-11-20
9399
6761Join에서... [2]
김우성
2013-11-17
7308
6759select가 궁금합니다... [1]
김우성
2013-11-09
6997
6757커서 이용 조회구문
DBDB
2013-11-05
7148
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.053초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다