Comment obtenir un résultat flottant en divisant deux valeurs entières en utilisant T-SQL?


173

En utilisant T-SQL et Microsoft SQL Server, je voudrais spécifier le nombre de chiffres décimaux lorsque je fais une division entre 2 nombres entiers comme:

select 1/3

Cela revient actuellement 0. J'aimerais qu'il revienne 0,33.

Quelque chose comme:

select round(1/3, -2)

Mais ça ne marche pas. Comment puis-je obtenir le résultat souhaité?


3
Avez-vous essayé 1.0 / 3?
Thilo

Les réponses que j'ai sont plus que suffisantes
LaBracca

Réponses:


277

Les suggestions de stb et xiowl conviennent si vous recherchez une constante. Si vous devez utiliser des champs ou des paramètres existants qui sont des entiers, vous pouvez d'abord les convertir en flottants:

SELECT CAST(1 AS float) / CAST(3 AS float)

ou

SELECT CAST(MyIntField1 AS float) / CAST(MyIntField2 AS float)

Ou vous pouvez les convertir en décimales, si vous voulez un résultat décimal.
Tim

30
SELECT 1.0 * MyInt1 / MyInt2
Troglo

@TroubleZero pour une utilisation MySQLdecimal
itsazzad

merci beaucoup, tu as sauvé ma journée. J'ai essayé CAST (7/3 AS float) mais j'en ai retourné 2 à nouveau. Mon problème est donc résolu.
Yasin Yörük

3
pas besoin de lancer à la fois le dividende et le diviseur, voir la réponse de
@MS

70

Parce que SQL Server effectue une division entière. Essaye ça:

select 1 * 1.0 / 3

Ceci est utile lorsque vous passez des entiers en tant que paramètres.

select x * 1.0 / y

1
Vous pouvez même omettre les zéros.
John

43

Il n'est pas nécessaire de les lancer tous les deux. Le type de données de résultat pour une division est toujours celui avec la priorité de type de données la plus élevée . Ainsi, la solution doit être:

SELECT CAST(1 AS float) / 3

ou

SELECT 1 / CAST(3 AS float)

27

utilisation

select 1/3.0

Cela fera le travail.


13

Je comprends que CASTing to FLOATn'est pas autorisé dans MySQL et générera une erreur lorsque vous tenterez de le faire CAST(1 AS float)comme indiqué sur MySQL dev .

La solution de contournement à ce problème est simple. Fais juste

(1 + 0.0)

Ensuite, utilisez ROUNDpour obtenir un nombre spécifique de décimales comme

ROUND((1+0.0)/(2+0.0), 3)

Le SQL ci-dessus divise 1 par 2 et renvoie un flottant à 3 décimales, comme dans ce cas 0.500 .

On peut CASTles types suivants: binaire, char, date, datetime, décimal, json, nchar, signé, heure et non signé .


3
MySQL le permet CAST, il n'autorise tout simplement pas la diffusion FLOAT. Diffusez DECIMALplutôt sur. Voir par exemple stackoverflow.com/questions/7368163/… .
markusk le

7

On dirait que cette astuce fonctionne dans SQL Server et est plus courte (basée sur les réponses précédentes)

SELECT 1.0*MyInt1/MyInt2

Ou:

SELECT (1.0*MyInt1)/MyInt2

2
J'ai aimé cela le plus, cela a même l'air bien pour les calculs de pourcentage:SELECT 100.0 * @Elapsed / @Total
EliSherer

3

Utilisez ceci

select cast((1*1.00)/3 AS DECIMAL(16,2)) as Result

Ici, dans ce sql, convertissez d'abord en flottant ou multipliez par 1,00. Quelle sortie sera un nombre flottant. Ici, je considère 2 décimales. Vous pouvez choisir ce dont vous avez besoin.


2

Si vous êtes venu ici (tout comme moi) pour trouver la solution pour la valeur entière , voici la réponse:

CAST(9/2 AS UNSIGNED)

renvoie 5

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.