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
운영게시판
최근게시물
MySQL Q&A 31213 게시물 읽기
No. 31213
마농님의 도움의 손길이 필요합니다.
작성자
김경민(int007)
작성일
2019-01-21 19:24ⓒ
2019-01-22 12:39ⓜ
조회수
2,345

WITH t1 AS

(

SELECT 1822218 cnt

)

, t2 AS

(

SELECT 1 seq ,0 start ,100000 ends ,5 cals

UNION ALL SELECT 2 , 100001, 300000, 4.8

UNION ALL SELECT 3, 300001, 1000000 ,4.6

UNION ALL SELECT 4, 1000001, 2000000 ,4.4

UNION ALL SELECT 5, 2000001 ,5000000, 4.2

UNION ALL SELECT 6, 5000001 ,99999999999, 4.2

)

 

=100000*5+200000*4.8+700000*4.6+(1822218-1000000)*4.4

=500000+960000+3220000+3617759 =8297759 가 나와야 한다는데

 

마농님이 알려주신 쿼리를 어떻게 변형해야 하는지 ㅠ.ㅠ

길이 너무 머네요 ㅠ.ㅠ

 

 

이 글에 대한 댓글이 총 2건 있습니다.
select sum(round( cnt*cals ))
from (
  SELECT 
    greatest(1,b.start)
    ,LEAST(b.ends, a.cnt)
    ,(LEAST(b.ends, a.cnt) - (greatest(1,b.start)-1)) cnt
    ,b.cals
    ,(LEAST(b.ends, a.cnt) - (greatest(1,b.start)-1)) * b.cals x
    FROM (
      SELECT 1882218 cnt
   ) a
   INNER JOIN (
     SELECT 1 seq ,0 start ,100000 ends ,5 cals
    UNION ALL SELECT 2 , 100001, 300000, 4.8
    UNION ALL SELECT 3, 300001, 1000000 ,4.6
    UNION ALL SELECT 4, 1000001, 2000000 ,4.4
    UNION ALL SELECT 5, 2000001 ,5000000, 4.2
    UNION ALL SELECT 6, 5000001 ,99999999999, 4.2
   ) b
      ON a.cnt >= b.start
) t
; 

지난 예제에서 1이 -> 0으로 변경되고

계산결과에서 소수 처리가 변경 된 듯 하네요.

greatest 이용해 0일 경우 1로

소수처리는 round등 업무 요건에 따라 올림, 내림, 반올림 처리 하시면 될 것으로 보입니다.

박인호(paerae)님이 2019-01-22 10:41에 작성한 댓글입니다.

select sum(round( cnt*cals ))

from (

SELECT

greatest(1,b.start)

,LEAST(b.ends, a.cnt)

,(LEAST(b.ends, a.cnt) - (greatest(1,b.start)-1)) cnt

,b.cals

,(LEAST(b.ends, a.cnt) - (greatest(1,b.start)-1)) * b.cals x

FROM (

SELECT 1822218 cnt

) a

INNER JOIN (

SELECT 1 seq ,0 start ,100000 ends ,5 cals

UNION ALL SELECT 2 , 100001, 300000, 4.8

UNION ALL SELECT 3, 300001, 1000000 ,4.6

UNION ALL SELECT 4, 1000001, 2000000 ,4.4

UNION ALL SELECT 5, 2000001 ,5000000, 4.2

UNION ALL SELECT 6, 5000001 ,99999999999, 4.2

) b

ON a.cnt >= b.start

) t

;

답변 너무 너무 감사합니다. 많이 배우고 갑니다.

그리고 시작값은 협의하여 1부터 받기로 하였습니다.

 

김경민(int007)님이 2019-01-22 12:41에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
31217가로로 출력방법 [1]
완전초보
2019-02-23
2072
31216MySQL 이벤트프로시저 물리적 다른호스트에 INSERT를 할 수 있을까요? [1]
푸르미
2019-02-22
1852
31215정규화, 비정규화
rlgns
2019-02-13
2085
31213마농님의 도움의 손길이 필요합니다. [2]
김경민
2019-01-21
2345
31212MySQL 계정 비밀번호 만료 기간을 없애고 확인하는 방법이 궁금합니다.
조동건
2019-01-21
2588
31210고수님의 답변 기다립니다. [2]
김경민
2019-01-16
2225
31208쿼리 응답속도 질문! [1]
권순환
2018-12-24
2252
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.048초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다