Недавно у нас возникла проблема с генерацией отчетов, в которой была выполнена агрегация (SUM()
) для значений varchar.
Эти значения хранятся в человеко-часах и являются целочисленными значениями, например: 456.9.
Поскольку мы находимся в ведении, невозможно изменить дизайн стола.
После некоторых исследований я изменил запрос, добавив явное приведение.
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.
Может ли кто-нибудь помочь мне с этим. Есть ли какие-то специальные функции или какие-либо другие обходные пути?