최근에 우리는 varchar 값에 대해 집계 (SUM()
)가 수행 된 보고서 생성 문제가있었습니다. 이 값은 정수 값인 예를 들어, 456.9 인 man hours가 저장됩니다. 우리는 유지 보수에 들어갔 기 때문에 테이블 디자인을 변경할 수 없습니다. 일부 연구 후 일부 명시 적 캐스팅을 추가하여 쿼리를 수정했습니다.10 진수로 캐스팅 된 varchar의 집계가 올바른 대답을 제공하지 않음
select ts.changedto as CHANGEDSTATE,
cast(sum(coalesce(cast(trim(tw.estimatedhours) AS DECIMAL(5,2)),0)) AS UNSIGNED) as ESTIMATEDHOURS,
cast(sum(coalesce(cast(trim(tw.actualhours) AS DECIMAL(5,2)),0)) AS UNSIGNED) as ACTUALHOURS
from tstatechange ts
left outer join tworkitem tw on (ts.workitemkey=tw.workitemkey)
left outer join tprojcat pc on (tw.prOJCATKEY = pc.pKEY)
where (ts.changedto = '8') and ts.lastedit between '2012-02-01 00:00:00' and '2012-02-28 23:59:59'
and pc.projkey = 39 group by CHANGEDSTATE;
이 쿼리조차도 잘못된 값을 반환합니다. 이러한 값에 대한 예를 수동 합계를 들어
(89.35
96
11.15
0
0.1
92
1
609.05
61.25
0.5
1
0.5)
은 961.9 산출하지만 쿼리 수익은 963 는 사람이 좀 도와 수 있습니다. 특별한 기능이나 다른 해결 방법이 있습니까?
안녕하세요. 답장을 보내 주셔서 감사합니다. 우리가 사용하는 데이터베이스는 mysql 5.1 (InnoDB)이다. –
각각 varchar를 10 진수 값으로 변환했는데, mysql이 그 값을 반올림합니까? 반올림이 발생하면 합계 후에 일어날 것으로 예상됩니다. –
그럼 가장 바깥 쪽의 캐스트를 제거하고 962.9를 반환합니다! 0.5 값이 실제로 반올림됨을 의미합니다. –