web-dev-qa-db-fra.com

Comment convertir un entier en décimal dans une requête SQL Server?

Une colonne height est un type entier dans ma table SQL Server. Je veux faire une division et avoir le résultat sous forme décimale dans ma requête:

Select (height/10) as HeightDecimal

Comment puis-je lancer pour que le HeightDecimal ne soit plus un entier? Merci.

41
RJIGO
SELECT height/10.0 AS HeightDecimal FROM dbo.whatever;

Si vous voulez une échelle de précision spécifique, dites-le:

SELECT CONVERT(DECIMAL(16,4), height/10.0) AS HeightDecimal
  FROM dbo.whatever;
64
Aaron Bertrand
SELECT CAST(height AS DECIMAL(18,0)) / 10

Edit: Comment ça marche sous le capot?

Le type de résultat est identique au type des deux arguments ou, s'ils sont différents, il est déterminé par le table de priorité du type de données . Vous pouvez donc convertir l'un ou l'autre argument en quelque chose de non-intégral.

Maintenant, DECIMAL(18,0), ou vous pouvez écrire de manière équivalente, simplement DECIMAL, est toujours une sorte de type entier, car cette échelle par défaut de 0 Signifie "pas de chiffres à droite de la virgule". Ainsi, un acteur peut, dans différentes circonstances, fonctionner correctement pour arrondir des nombres entiers - le contraire de ce que nous essayons d'accomplir.

Cependant, les DECIMAL ont leurs propres règles pour tout. Ce sont généralement des nombres non entiers, mais toujours des nombres exacts. Le type de résultat de la division DECIMAL que nous avons forcé à se produire est spécialement déterminé doit être, dans notre cas, DECIMAL (29,11). Le résultat de la division sera donc arrondi à 11 places, ce qui ne pose aucun problème pour la division par 10, mais l'arrondi devient observable lors de la division par 3. Vous pouvez contrôler le degré d'arrondi en manipulant l'échelle de l'opérande gauche. Vous pouvez également arrondir davantage, mais pas moins, en plaçant une autre opération ROUND ou CAST autour de l'expression entière.

Une mécanique identique régit la solution la plus simple et la plus agréable dans la réponse acceptée:

  SELECT height / 10.0

Dans ce cas, le type du diviseur est DECIMAL(3,1) et le type du résultat est DECIMAL(17,6). Essayez de diviser par 3 et observez la différence en arrondissant.

Si vous n'aimez pas tout ce discours sur les précisions et les échelles et que vous voulez simplement que SQL Server effectue tous les calculs dans de bons vieux calculs arithmétiques à virgule flottante double précision, vous pouvez forcer cela aussi:

SELECT height / CAST(10 AS FLOAT(53))

ou de manière équivalente juste

SELECT height / CAST (10 AS FLOAT)
20
Jirka Hanika

Vous pouvez soit convertir la hauteur en décimale:

select cast(@height as decimal(10, 5))/10 as heightdecimal

ou vous placez un point décimal dans votre valeur que vous divisez par:

declare @height int
set @height = 1023

select @height/10.0 as heightdecimal

voir sqlfiddle avec un exemple

4
Taryn
select cast (height as decimal)/10 as HeightDecimal
2
Dewfy