web-dev-qa-db-fra.com

Valeurs décimales en SQL pour la division des résultats

En SQL, j'ai col1 Et col2. Les deux sont des entiers.

Je veux faire comme:

select col1/col2 from tbl1

Je reçois le résultat 1col1=3 Et col2=2

Le résultat que je veux est 1.1

Je mets round(col1/col2,2). Le résultat est toujours 1.

Je mets decimal(col1/col2,2). La décimale n'est pas intégrée à la fonction.

Comment puis-je faire exactement pour obtenir 1.1?

46
william

Vous devrez convertir ou convertir les valeurs en valeurs décimales avant la division. Jetez un oeil à ceci http://msdn.Microsoft.com/en-us/library/aa226054.aspx

Par exemple

DECLARE @num1 int = 3 DECLARE @num2 int = 2

SELECT @num1/@num2

SELECT @num1/CONVERT(decimal(4,2), @num2)

Le premier SELECT produira ce que vous verrez tandis que le second SELECT aura la bonne réponse 1.500000

43
Shiv Kumar

Juste une autre approche:

SELECT col1 * 1.0 / col2 FROM tbl1

Multiplier par 1,0 transforme un entier en un float numeric (13,1) et fonctionne donc comme un transtypage, mais le plus probablement est plus lent que cela.

Une variation légèrement plus courte suggérée par Aleksandr Fedorenko dans un commentaire:

SELECT col1 * 1. / col2 FROM tbl1

L'effet serait fondamentalement le même. La seule différence est que le résultat de la multiplication dans ce cas serait numérique (12,0) .

Principal avantage: moins verbeux que les autres approches.

98
Andriy M

SELECT CAST (col1 as float) / col2 FROM tbl1

Un casting devrait fonctionner. ("Moins est plus.")

De documentation en ligne :

Renvoie le type de données de l'argument ayant la priorité la plus élevée. Pour plus d'informations sur la priorité des types de données, consultez Precedence des types de données (Transact-SQL) .

Si un dividende entier est divisé par un diviseur entier , le résultat est un entier dont la partie fractionnaire du résultat est tronquée

13
bensiu

Il peut y avoir d'autres moyens d'obtenir le résultat souhaité.

Declare @a int
Declare @b int
SET @a = 3
SET @b=2
SELECT cast((cast(@a as float)/ cast(@b as float)) as float)
3
ashish.chotalia