Вычисление малого числа возвращает 0 на SQL сервере - PullRequest
0 голосов
/ 31 марта 2020

Когда я пытаюсь вычислить процент, он возвращает 0. Я попробовал демо, где он работает с использованием числового типа c.

declare @percent int;
declare @test1 numeric = '5723897'
declare @test2 numeric = '52670845' 

select @percent = (@test1/@test2) * 100.0

select @percent

, но как только я изменю числа, есть большая разница, я просто получаю 0. Как я могу представить это как значение? Я пытался привести к десятичной дроби, но это не работает.

declare @percent int;
declare @test1 numeric = '57238'
declare @test2 numeric = '52670845' 

select @percent = cast((@test1/@test2) * 100.0 as decimal(10,2))

select @percent

Любой совет по этому поводу был бы великолепен. Спасибо!

Ответы [ 3 ]

1 голос
/ 31 марта 2020

Вот ваша проблема: declare @percent int;

вы сохраняете результат вычисления в типе данных int, поэтому, естественно, вы получите усеченное число - в данном случае - 0.

declare @intPercent int, @percent numeric(15,10);
declare @test1 numeric(10,0) = 57238
declare @test2 numeric(10,0) = 52670845

select  @percent = (@test1/@test2) * 100.0,
        @intPercent = (@test1/@test2) * 100.0

select @percent As [@percent], @intPercent As [@intPercent]

Результаты:

@percent        @intPercent
0,1086711250    0
0 голосов
/ 31 марта 2020

Вы присваиваете int, который не поддерживает десятичные дроби. Вы можете сделать проценты десятичными или умножить их более чем на 100. Посмотрите следующий код для идей.

declare @percent int;
declare @percentdec decimal(30,20);
declare @test1 numeric = '57238'
declare @test2 numeric = '52670845' 

select cast((@test1/@test2) * 100.0 as decimal(10,2))
select @percent = cast((@test1/@test2) * 100.0 as decimal(10,2))
select @percentdec = cast((@test1/@test2) * 100.0 as decimal(10,2))

select @percent
select @percentdec
0 голосов
/ 31 марта 2020
declare @percent int;
...
select @percent

эта переменная integer. Значения ниже 1 равны 0.

Вы можете использовать десятичные данные для всех переменных

declare @percent decimal(18,6);
declare @test1 decimal(18,6) = 57238
declare @test2 decimal(18,6) = 52670845

select @percent = @test1/@test2 * 100.0

select @percent

Результат: 0.108671

Или альтернативно изменить тип данных early во время вычисления путем введения десятичного числа (* 100.0) на первом шаге вычисления:

declare @percent decimal(18,6);
declare @test1 int = 57238
declare @test2 int = 52670845

select @percent = @test1 * 100.0 / @test2

select @percent
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...