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é?

LaBracca
la source
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)
Richard
la source
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
xiaowl
la source
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)
SP
la source
27

utilisation

select 1/3.0

Cela fera le travail.

stb
la source
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é .

Dauphin suprême
la source
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
Troglo
la source
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.

nazmul.3026
la source
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

troyen
la source