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?

LaBracca
fonte
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)
Richard
fonte
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
xiaowl
fonte
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)
em
fonte
27

usar

select 1/3.0

Isso fará o trabalho.

stb
fonte
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 .

Golfinho Supremo
fonte
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
Troglo
fonte
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.

nazmul.3026
fonte
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

trojan
fonte