Вопрос по sql, sql-server, sql-server-2008 – Что не так с этим вычислением деления запросов SQL Server?

3

У меня есть эта структура таблицы в базе данных SQL Server 2008 R2:

  CREATE TABLE FormTest
(   
clientid char(10),
DateSelected date,
A int,
B int,
C int
)

Я заполнил таблицу FormTest следующей информацией

clientid        DateSelected      A       B     C
x1              2006-06-09     65150    4921    1
x2              2006-05-05     155926   69092   1
x3              2006-01-20     95603    156892  1
x4              2006-01-20     30704    164741  1
x4              2006-02-03     65150    174834  1
x5              2006-04-28     59629    4921    1
x6              2006-01-27     30704    162356  1
x7              2006-06-30     65150    4921    1
x8              2006-07-10     65150    4921    1

И наконец, я запускаю этот SQL-запрос:

SELECT clientid, (((a+ b + c) / 3) / 216647 * 10) AS Formula1 
    From FormTest

Но потом я получил эти результаты:

clientid        Formula1      
x1              0
x2              0
x3              0
x4              0
x4              0
x5              0
x6              0
x7              0
x8              0

Кто-нибудь может сказать мне, что я делаю не так?

ВЫБЕРИТЕ (((CAST (65150 AS FLOAT) + CAST (4921 AS FLOAT) + CAST (1 AS FLOAT)) / 3) / 216647 * 10) AS Formula1, хотя вы, вероятно, могли бы просто привести результат своего a + b + c как плавающий и получить тот же результат. Сделайте удар и посмотрите, как вы идете. Mr Moose

Ваш Ответ

4   ответа
0
declare @a int
declare @b int
declare @c int
set @a=65150
set @b=4921
set @c=1

select convert(float,((@[email protected][email protected])/ 216647.0 * 10) )
0

оигнорирована). Следовательно, при делении работайте с десятичными знаками или числами с плавающей запятой. Это должно работать в дополнение к решениям с плавающей точкой, приведенным ранее. Замените (12,2) с вашей предпочтительной точностью:

SELECT clientid, (((
Cast(a as decimal(12,2)) + 
Cast(b as decimal(12,2)) + 
Cast(c as decimal(12,2)) 
) / 3) / 216647 * 10) AS Formula1 
FROM FormTest
2

поэтому ваши результаты всегда будут округлены до ближайшего целого числа. Поскольку вы делите на 3, то на 216647, основываясь на числовых значениях, ваш результат округляется до 0 каждый раз. Вам потребуется использовать тип данных с десятичной (точной) или с плавающей точкой (приблизительной) и / или приведение, если вы хотите получить нецелочисленные результаты.

4

что вы делаете целочисленное деление. Вы должны преобразовать один из операндов в плавающий или десятичный (в зависимости от точности и цели вычислений, которые вы делаете), используя что-то вроде:

((CAST((a+ b + c) AS FLOAT) / 3) / 216647 * 10)

или возможно:

(((a+ b + c) / 3.0) / 216647.0 * 10)

Похожие вопросы