Published on

September 16, 2019

Comprendre les calculs SQL Server

Avez-vous déjà rencontré une situation où vos calculs SQL Server ne vous ont pas donné les résultats attendus ? Vous n’êtes pas seul. Dans cet article, nous explorerons pourquoi SQL Server se comporte parfois de manière inattendue lorsqu’il s’agit de calculs mathématiques simples et comment vous pouvez garantir des résultats précis.

Commençons par un exemple concret. Imaginez que vous construisiez un mur et que vous ayez besoin de déterminer le nombre de montants requis. Vous décidez d’écrire une requête SQL pour vous aider dans vos calculs de charpente. Vous savez que le mur mesure 6 pieds de long et vous souhaitez placer un montant tous les 16 pouces. Vous écrivez donc la requête suivante :

SELECT (6 * 12) / 16

Étonnamment, la sortie de cette requête est 4, ce qui indique que vous avez besoin de 4 montants pour une section de mur. Cependant, si vous effectuez le même calcul dans une calculatrice, vous obtenez une réponse légèrement différente : 4,5. Cette différence peut être déroutante et conduire potentiellement à des murs de taille incorrecte.

Alors, que se passe-t-il ici ? Tout cela dépend de la façon dont SQL Server gère les calculs. Lorsque vous effectuez des calculs dans SQL Server, il convertit toutes les expressions en la datatype ayant la plus haute priorité. Dans ce cas, puisque tous les nombres impliqués sont des entiers, SQL Server conserve la réponse finale en tant qu’entier, en ignorant la partie décimale.

Pour résoudre ce problème, vous pouvez inclure une datatype dans l’équation qui permet des décimales et a une priorité plus élevée que les entiers. Une façon de faire cela est d’ajouter “.0” à l’une des valeurs dans le calcul :

SELECT (6 * 12) / 16.0

Cette modification garantit que le résultat est renvoyé sous forme de valeur décimale, vous donnant la réponse attendue.

Alternativement, vous pouvez simplement ajouter un “.” à l’équation :

SELECT (6 * 12) / 16.

Cela force également SQL Server à traiter le calcul comme une opération décimale.

Une autre approche, suggérée par Pat Phelan, consiste à utiliser la syntaxe “e” :

SELECT (6 * 12) / 16e0

Bien que cette méthode permette d’obtenir le même résultat, elle peut confondre les autres utilisateurs qui ne sont pas familiers avec cette syntaxe.

De toutes ces méthodes, l’ajout de “.0” est la plus simple et la moins ambiguë. Cependant, si la précision et l’échelle sont cruciales, vous pouvez utiliser la fonction CAST pour définir explicitement le type de données :

SELECT CAST((6 * 12) / 16.0 AS NUMERIC(2, 1))

En utilisant CAST, vous pouvez vous assurer d’obtenir la précision et l’échelle souhaitées dans votre résultat.

Maintenant, vous vous demandez peut-être pourquoi tout cela est important. Les conversions implicites et la priorité des datatypes sont des choses dont la plupart des personnes commençant avec SQL Server ne sont pas conscientes jusqu’à ce qu’elles rencontrent des résultats inattendus. Si vos requêtes nécessitent des réponses précises, il est essentiel d’être explicite et précis dans la façon dont vous traitez les données. Sinon, vous pourriez vous retrouver avec des calculs incorrects, tout comme la construction d’un mur de studio de manière incorrecte.

Pour plus d’informations sur ce type de conversions et d’autres exemples, vous pouvez consulter l’article d’Andy Mallon sur le sujet.

Rappelez-vous, comprendre comment SQL Server gère les calculs et être explicite dans vos requêtes peut vous éviter des maux de tête potentiels et garantir des résultats précis.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.