Como obter um resultado flutuante dividindo dois valores inteiros usando o T-SQL?


173

Usando o T-SQL e o Microsoft SQL Server, gostaria de especificar o número de dígitos decimais quando faço uma divisão entre 2 números inteiros, como:

select 1/3

Atualmente, isso retorna 0. Eu gostaria que ele voltasse 0,33.

Algo como:

select round(1/3, -2)

Mas isso não funciona. Como posso alcançar o resultado desejado?


3
Já experimentou 1.0 / 3?
Thilo

As respostas que recebi são mais que suficientes
LaBracca

Respostas:


277

As sugestões de stb e xiowl são boas se você estiver procurando por uma constante. Se você precisar usar campos ou parâmetros existentes que sejam números inteiros, poderá convertê-los para serem flutuadores primeiro:

SELECT CAST(1 AS float) / CAST(3 AS float)

ou

SELECT CAST(MyIntField1 AS float) / CAST(MyIntField2 AS float)

Ou você pode convertê-los como decimais, se desejar um resultado decimal.
Tim

30
SELECIONE 1,0 * MyInt1 / MyInt2
Troglo

@TroubleZero for MySQL usedecimal
itsazzad

muito obrigado, você salvou o meu dia. Eu tentei o CAST (7/3 AS float), mas retornei 2 novamente. Então os números de elenco estão resolvidos, meu problema.
Yasin Yörük

3
não há necessidade de lançar tanto dividendo e divisor, ver a resposta '@MS stackoverflow.com/a/30639343/2866644
robotik

70

Porque o SQL Server executa divisão inteira. Tente o seguinte:

select 1 * 1.0 / 3

Isso é útil quando você passa números inteiros como parâmetros.

select x * 1.0 / y

1
Você pode até deixar de fora os zeros.
John

43

Não é necessário lançar os dois. O tipo de dados do resultado para uma divisão é sempre aquele com maior precedência . Assim, a solução deve ser:

SELECT CAST(1 AS float) / 3

ou

SELECT 1 / CAST(3 AS float)

27

usar

select 1/3.0

Isso fará o trabalho.


13

Eu entendo que CASTo ING FLOATnão é permitido em MySQL e irá gerar um erro quando você tenta CAST(1 AS float)conforme indicado no MySQL desenv .

A solução alternativa para isso é simples. Apenas faça

(1 + 0.0)

Em seguida, use ROUNDpara obter um número específico de casas decimais, como

ROUND((1+0.0)/(2+0.0), 3)

O SQL acima divide 1 por 2 e retorna um valor flutuante para 3 casas decimais, como seria 0.500.

Pode- CASTse os seguintes tipos: binário, char, data, data e hora, decimal, json, nchar, assinado, hora e não assinado .


3
O MySQL permite CAST, apenas não permite a transmissão FLOAT. Transmitir para em DECIMALvez disso. Consulte, por exemplo, stackoverflow.com/questions/7368163/… .
markusk

7

Parece que esse truque funciona no SQL Server e é mais curto (com base nas respostas anteriores)

SELECT 1.0*MyInt1/MyInt2

Ou:

SELECT (1.0*MyInt1)/MyInt2

2
Eu gostei mais, ele ainda parece bom para cálculos percentuais:SELECT 100.0 * @Elapsed / @Total
EliSherer

3

Usa isto

select cast((1*1.00)/3 AS DECIMAL(16,2)) as Result

Aqui, neste sql, converta primeiro para flutuar ou multiplique por 1,00. Qual saída será um número de flutuação. Você pode escolher o que precisa.


2

Se você veio aqui (assim como eu) para encontrar a solução para o valor inteiro , aqui está a resposta:

CAST(9/2 AS UNSIGNED)

retorna 5

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.