2016-03-21 2 views
-1

Cela peut sembler très simple, mais je ne peux pas le comprendre. J'ai un champ qui est datatype bigint et j'essaye de le multiplier par un autre champ qui est décimal (9,5) mais je viens d'obtenir null dans tous mes calculs. J'ai essayé de lancer le Bigint en décimal et ça ne marche pas non plus. Qu'est-ce que je rate? J'utilise SQL Server 2000 je crois. Je référence le numéro de deux tables différentes jointes sur un champ commun.SQL Bigint * Décimal

((cast([costs] as decimal(9,5)) * cast([Ratio] as decimal(9,5))) as [Cost Ratio] 

J'ai aussi ajouté isnull (rapport, 0) et maintenant il remplit mes valeurs nulles avec ,00000 mais ne reçoivent pas la valeur multipliée dans le champ [rapport coût].

enter image description here

+1

Quels SGBDR utilisez-vous? – Jeroen

+0

En outre, un [mcve] pourrait aider. Si je suppose MSSQL 2014 et [essayez 'SELECT CAST (3 AS BIGINT) * CAST (2.5 AS DECIMAL (9,5))' cela fonctionne comme prévu] (http://sqlfiddle.com/#!6/9eecb7/6614/0). – Jeroen

+0

Ce serait bien que vous mettiez la formule que vous utilisez et comment vous jetez les valeurs. – Kamamba

Répondre

2

Vous devriez obtenir des exceptions arithmétiques, pas une valeur nulle. Vous affectez vos valeurs BigInt à decimal(9,5) qui a une précision = 9 échelle = 5 qui ne laisse que 4 chiffres sur le côté gauche de la décimale. Toutes vos valeurs dans votre colonne BigInt comportent au moins 6 chiffres ou plus. Cela signifie qu'il n'y a pas assez de place dans le decimal(9,5) pour stocker cette grande valeur int. Essayez decimal(18,5), ce qui laisse beaucoup d'espace sur le côté gauche de la décimale, pour vos types dans votre requête.

Aussi ne pas oublier ISNULL (où la valeur peut être nulle dans les données) et attendez que si elle est nulle, alors vous allez obtenir un résultat de 0.

((cast([ISNULL(costs,0)] as decimal(18,5)) * cast([ISNULL(Ratio,0)] as decimal(18,5))) as [Cost Ratio] 

Aussi, si votre colonne Ratio type est déjà un decimal(9,5) alors ne le convertissez pas à nouveau, ajoutez le ISNULL vérifiez si c'est une colonne nullable.

Voir: Sql Server Decimals pour plus de détails sur le type décimal du serveur sql. La raison pour laquelle j'ai choisi 18 que la précision a à voir avec le stockage.

+0

J'ai donc essayé ceci quelque chose a changé, maintenant je reçois tous 0.000000000 dans ma colonne de résultats. Cela signifie-t-il que SQL pense qu'un de mes champs est nul? –

+0

Eh bien, '0 * any value' est toujours 0 à l'exception de n'importe quelle valeur étant' NULL'. – Igor

+0

Si vous n'êtes pas sûr de la colonne, modifiez le sélectionner en les séparant pour le savoir. '((cast ([ISNULL (coûts, 0)] comme décimal (18,5)) AS LeftSide, cast ([ISNULL (Ratio, 0)] comme décimal (18,5))) AS RightSide' – Igor