3
votes

Attribuer un quotient ou une expression plus longue à la variable locale (réelle) T SQL

J'ai été surpris d'apprendre cela, je suis sûrement en train de faire une erreur ...

Si je DECLARE une variable locale réelle (ou décimale), je ne peux pas affecter ( SET ) la valeur d'une expression? Je dois d'abord définir une valeur puis parcourir l'expression. Si j'essaye de "faire le calcul" d'un seul coup, j'obtiens 0.

Donc, ça marche ..

DECLARE @HitRate real
SET @HitRate = 805499
SET @HitRate = (@HitRate / 847125) * 100
--SET @HitRate = (805499 / 847125) * 100  --But this does not work?
SELECT @HitRate
  • Si je commente la première instruction 2 SET et que j'utilise simplement la troisième, j'obtiens 0
  • Si j'utilise tous les 3 , j'obtiens 0
  • Si je CAST (@HitRate As DECIMAL (9,2)) j'obtiens 0


3 commentaires

Copie possible de Comment obtenir un résultat float en diviser deux valeurs entières?


Peter B, d'accord, dupliquer, je ne savais tout simplement pas que j'avais un problème de flotteur, pensait que c'était la complexité de l'expression parce que cela "fonctionnait" quand je l'ai cassé en étape. Vraiment juste fait une conversion après le premier set et m'a mis en territoire flottant.


C'est bizarre comment vous avez accepté la réponse la plus simple qui ne contient aucune clarification sur la cause puisque vous demandez pourquoi (805499/847125) * 100 a renvoyé 0 !!!! vous n'avez pas demandé comment faire une solution de contournement.


3 Réponses :


0
votes

cela fonctionne pour moi: essayez d'ajouter .00 dans la valeur définie.

DECLARE @HitRate real
SET @HitRate = 805499.00
SET @HitRate = (@HitRate / 847125.00) * 100.00
--SET @HitRate = (805499 / 847125) * 100  --But this does not work?
SELECT @HitRate

entrez la description de l'image ici


2 commentaires

Vous l'avez, désolé d'avoir été stupide à propos de mon CAST. Cela marche:


Donnez au gars le temps d'évaluer votre solution (et d'autres); ne suppliez pas les gens de marquer votre réponse comme réponse dans les 5 minutes.



1
votes

démo vous devez faire que 805499 à 805499.00 ce qui signifie int pour flotter XXX

vous avez 0 parce que, 805499/847125 = 0,95 mais le moteur de base de données renvoie 0 parce qu'il prend que c'est une valeur entière, c'est pourquoi lorsque vous multipliez 100 par 0, il produit également la sortie 0

ou vous pouvez explicitement cast comme ci-dessous
SET @HitRate = (cast( 805499 as float) / 847125) * 100 

il renverra également 95.0862

p >


0 commentaires

0
votes

Si vous utilisez l'instruction suivante

DECLARE @HitRate real
SET @HitRate = 805499
SET @HitRate = (@HitRate / 847125) * 100
SELECT @HitRate 

Elle renverra 0 puisque 805499 et 847125 sont entier donc le résultat de la division est entier = 0.

Basé sur Documentation officielle de la division TSQL :

Renvoie le type de données de l'argument avec la priorité la plus élevée.

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

Vous pouvez vérifier la liste de priorité des types de données SQL à partir du lien ci-dessous:

Mais lorsque vous utilisez:

SET @HitRate = (805499 / 847125) * 100

Il renverra 95.0862 depuis @HitRate code > est de type real et a une priorité plus élevée que l'entier


1 commentaires

D'accord. Si je "retourne" {SET @HitRate = (847125/805499)} j'obtiens 1