2012-03-07 6 views
1

최근에 우리는 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 는 사람이 좀 도와 수 있습니다. 특별한 기능이나 다른 해결 방법이 있습니까?

답변

0

쿼리가 반올림되는 것으로 보입니다. 그 두 개의 0.5는 아마도 두 개의 1이 될 것입니다. 963을줍니다. 어떤 데이터베이스를 사용합니까?

+0

안녕하세요. 답장을 보내 주셔서 감사합니다. 우리가 사용하는 데이터베이스는 mysql 5.1 (InnoDB)이다. –

+0

각각 varchar를 10 진수 값으로 변환했는데, mysql이 그 값을 반올림합니까? 반올림이 발생하면 합계 후에 일어날 것으로 예상됩니다. –

+0

그럼 가장 바깥 쪽의 캐스트를 제거하고 962.9를 반환합니다! 0.5 값이 실제로 반올림됨을 의미합니다. –

0

사용중인 SQL 서버를 언급하지는 않았지만 MS SQL Server 2008R2에서는이 작업을 반복 할 수 없습니다. 쿼리가 나열한 데이터를 반환합니까?

select '89.35' as x 
into #tmp 
union all select '96' 
union all select '11.15 ' 
union all select null 
union all select '0.10 ' 
union all select '92.00 ' 
union all select '1.00 ' 
union all select '609.05' 
union all select '61.25 ' 
union all select '0.50' 
union all select '1 ' 
union all select '0.50 ' 


select sum(coalesce(cast(ltrim(rtrim(x)) AS DECIMAL(5,2)),0)) 
from #tmp -- Yields 961.9 

select cast(sum(coalesce(cast(ltrim(rtrim(x)) AS DECIMAL(5,2)),0)) AS INT) 
from #tmp -- Yields 961 

select 89.35+96.0+11.15+0.0+0.1+92.0+1.0+609.05+61.25+0.5+1.0+0.5 -- Yields 961.9 

SQL Server에는 UNSIGNED 형식이 없으므로 INT를 사용했습니다.

+0

안녕하세요. 귀하의 의견을 기다립니다. 우리는 mysql (innoDB)를 다음과 같이 사용합니다. 우리 데이터베이스. 나는 그것을 언급하지 않았으므로 내 실수. –

+0

글쎄, 처음 3 쿼리는 mysql에서 작동하지 않습니다. 마지막 하나는 961.9가됩니다. –

+0

MySql을 사용하여 게시물에 태그를 추가했습니다 - 문제를 좁히는 데 도움이되므로 나중에 이것을 수행하십시오. – StuartLC

관련 문제