10
votes

SQL Diviser par deux comptes ()

J'ai la requête suivante, qui tente de comprendre le pourcentage d'un certain produit par rapport au nombre total de produits. IE: [Nombre de produits] / [Total des produits] = Pourcentage

;WITH totalCount AS(
    SELECT 
        CAST(COUNT(id) as Integer)as totalCount
    FROM TABLE_NAME
)
SELECT 
    ((CAST(COUNT(DISTINCT id) as Integer)/(SELECT * FROM totalCount))*100) as 'Percent'
FROM TABLE_NAME


0 commentaires

3 Réponses :


10
votes

Cochez votre compte total comme un numéro en plus d'entier (décimal?) - Les maths s'élèvent.


3 commentaires

Merci, ça a fonctionné! Ce sont toujours les choses simples qui vous montent.


Assurez-vous de commenter ce code. Le prochain développeur le plus peut ne pas être aussi intelligent que vous l'avez été.


J'utilise habituellement un hack encore plus simple et au lieu de multiplier par 100 multiplier par 100.0



2
votes

Ne devrait-il pas être:

;WITH totalCount AS(
    SELECT 
        CAST(COUNT(id) as Integer)as totalCount
    FROM TABLE_NAME
)
SELECT 
    ((CAST(COUNT(DISTINCT id) as Integer)*100/(SELECT count(*) FROM totalCount))) as 'Percent'
FROM TABLE_NAME


2 commentaires

Je ne pense pas que la requête totaleCompte ne renvoie qu'une rangée, donc si vous ajoutez dans le compte (*), il retournera toujours 1, au lieu du total réel. Merci pour l'aide en tout cas :)


ok :-) Mais en multipliant par 100 résoudra certainement votre problème.



5
votes

lancer comme quelque chose avec une précision décimale, pas entier. Un flotteur ou réel.

select cast(distinctCount as real)/cast(totalCount as real) * 100.00
   , distinctCount
   , totalCount
from (
 select count(distinct id) as distinctCount
  , count(id) as totalCount
  from Table) as aggregatedTable


1 commentaires

Utilisez Decimal N'utilisez jamais de flotteur ou réel dans un calcul mathématique, car ils sont des fichiers de données inexacts et peuvent introduire des erreurs d'arrondi.