La façon de calculer le pourcentage d'une instruction SQL
J'ai une table SQL Server qui contient les utilisateurs & leurs notes. Pour des raisons de simplicité, permet de dire il y a 2 colonnes - name
& grade
. Donc, typique de la ligne serait le Nom de "John Doe", Nuance:"Un".
Je suis à la recherche d'une instruction SQL qui vous permettra de trouver les pourcentages de toutes les réponses possibles. (A, B, C, etc...) Aussi, est-il un moyen de le faire sans que la définition de l'ensemble des réponses possibles (ouvrir le champ de texte - les utilisateurs pourraient entrer en "pass/fail', 'none', etc...)
La sortie finale, je suis à la recherche d'Un: 5%, B: 15%, C: 40%, etc...
Vous devez vous connecter pour publier un commentaire.
J'ai testé le suivant et cela fonctionne. La réponse par gordyii était proche, mais avait la multiplication des 100 au mauvais endroit et a eu quelques parenthèse manquante.
La plus efficace (à l'aide de plus()).
Universelle (toute version SQL).
Avec CTE, la moins efficace.
cast((count(*) / (sum(count(*)) over() / 100)) AS DECIMAL(18, 2)) as Percentage
over()
fonctionne très bien sur Postgresql 10Au lieu de séparer les CTE pour obtenir le total, vous pouvez utiliser une fonction de fenêtre sans la "partition par une clause".
Si vous utilisez:
pour obtenir le nombre d'un groupe, vous pouvez utiliser:
pour obtenir le nombre total d'.
Par exemple:
Il a tendance à être plus rapide dans mon expérience, mais je pense qu'il pourrait utiliser à l'interne d'une table temporaire dans certains cas (j'ai vu la "table de travail" lors de l'exécution avec "set statistics io on").
EDIT:
Je ne sais pas si mon exemple de requête est ce que vous cherchez, j'étais juste en illustrant la façon dont les fonctions de fenêtrage de travail.
tempdb
qui est la table de travail. Les lectures logiques semblent plus élevé mais ils sont comptés différemmentCOUNT(*) OVER ()
dans votre requête retourne complètement sans rapport avec la figure (plus précisément, le nombre de lignes de la regroupés jeu de résultats). Vous devez utiliserSUM(COUNT(*)) OVER ()
à la place.Vous devez calculer le total des notes
Si c'est SQL 2005, vous pouvez utiliser CTE
Vous avez besoin de groupe sur la pente de terrain. Cette requête devrait vous donner ce que vous cherchez dans pratiquement n'importe quel base de données.
Vous devez spécifier le système que vous utilisez.
J'ai tout simplement à utiliser quand j'ai besoin de travailler sur un pourcentage..
Remarque que 100,0 retourne décimales, alors que 100 sur son propre arrondir le résultat à l'entier le plus proche, même avec la fonction ROUND ()!
La suivante devrait fonctionner
EDIT: Déplacé le
* 100
et ajouté le1.0
pour s'assurer qu'il ne fait pas de division entièreC'est, je crois, une solution générale, bien que je l'ai testé à l'aide d'IBM Informix Dynamic Server 11.50.FC3. La requête suivante:
donne le résultat suivant sur les données de test ci-dessous la règle horizontale. Le
ROUND
fonction peut être spécifique de SGBD, mais le reste (probablement) ne l'est pas. (À noter que j'ai changé de 100 à 100,0 afin de s'assurer que le calcul se fait à l'aide non-entier DECIMAL, NUMERIC - arithmétique; voir les commentaires, et merci à Tonnerre.)Dans toute version de sql server, vous pouvez utiliser une variable pour le total de toutes les classes comme ceci:
Vous pouvez utiliser une sous-sélection de votre à partir d'une requête (non testé, et pas sûr de ce qui est plus rapide):
Ou
Ou
Vous pouvez également utiliser une procédure stockée (mes excuses pour la Firebird syntaxe):