#sql-server #rounding
#sql-server #округление
Вопрос:
Я был бы признателен, если бы вы могли ознакомиться со следующим кодом SQL и рассказать мне, как заставить SQL server НЕ округлять результат мультипликации 4-го столбца выбора:
select --tmp1.[Session.Call_TYPE_Assigned] CR,
tmp2.cnt_match / cast(tmp1.cnt as float) as precision,
tmp1.cnt as cnt,
tmp2.cnt_match / cast(tmp1.cnt as float) * tmp1.cnt
from
( select [Session.Call_TYPE_Assigned],COUNT(*) as cnt from
dbo.CEA_CR CEA_CR
where CEA_CR.cycle = '4' and CEA_CR.version = '1'
group by [Session.Call_TYPE_Assigned] ) as tmp1
,
(select [Session.Call_TYPE_Assigned],COUNT(*) as cnt_match from
dbo.CEA_CR CEA_CR
where [Session.Did_Call_Type_happen_on_this_call]= 'Yes' and CEA_CR.cycle = '4' and CEA_CR.version = '1'
group by [Session.Call_TYPE_Assigned]) tmp2
where tmp1.[Session.Call_TYPE_Assigned] = tmp2.[Session.Call_TYPE_Assigned]
результирующий набор выглядит следующим образом
0.666666666666667
3
2
хотя 2 не является произведением 0,6 * 3, спасибо
Ответ №1:
Я бы подумал, что либо:
convert(float,tmp2.cnt_match / cast(tmp1.cnt as float) * tmp1.cnt)
в качестве последней строки выбора или
convert(float,[precision] * tmp1.cnt)
в качестве последней строки выбора может сработать.
Комментарии:
1. Я немного удивлен, потому что, если вы запустите SELECT convert (FLOAT, 0.6667 * 2) на своем компьютере, вы должны получить 2.0001!
2. Эй, я только что запустил 0.6666666666666667 в приведенном выше выборе, и он также дает 2, возможно, это достаточно точно для SQL Server.
3. Может быть, это просто float! ВЫБЕРИТЕ преобразовать(десятичное число (16,15),0,666666666666667 * 3).