J'ai une table SQL Server qui contient les utilisateurs et leurs notes. Par souci de simplicité, disons simplement qu'il y a 2 colonnes - name
& grade
. Ainsi, une ligne typique serait Nom: "John Doe", Grade: "A".
Je recherche une instruction SQL qui trouvera les pourcentages de toutes les réponses possibles. (A, B, C, etc ...) En outre, y a-t-il un moyen de le faire sans définir toutes les réponses possibles (champ de texte ouvert - les utilisateurs peuvent entrer 'succès / échec', 'aucun', etc ...)
Le résultat final que je recherche est A: 5%, B: 15%, C: 40%, etc ...
sql
sql-server
tsql
Alex
la source
la source
Le plus efficace (en utilisant over ()).
Universel (toute version SQL).
Avec CTE, le moins efficace.
la source
cast((count(*) / (sum(count(*)) over() / 100)) AS DECIMAL(18, 2)) as Percentage
over()
fonctionne très bien sur Postgresql 10Au lieu d'utiliser un CTE séparé pour obtenir le total, vous pouvez utiliser une fonction de fenêtre sans la clause «partition par».
Si vous utilisez:
pour obtenir le décompte d'un groupe, vous pouvez utiliser:
pour obtenir le nombre total.
Par exemple:
Cela a tendance à être plus rapide dans mon expérience, mais je pense qu'il pourrait utiliser en interne une table temporaire dans certains cas (j'ai vu "Worktable" lors de l'exécution avec "set statistics io on").
EDIT: Je ne suis pas sûr si mon exemple de requête est ce que vous recherchez, je voulais juste illustrer le fonctionnement des fonctions de fenêtrage.
la source
tempdb
laquelle se trouve la table de travail. Les lectures logiques semblent plus élevées mais elles sont comptées différemment de la normaleCOUNT(*) OVER ()
dans votre requête renvoie un chiffre totalement indépendant (en particulier, le nombre de lignes du jeu de résultats groupé ). Vous devriez utiliser à laSUM(COUNT(*)) OVER ()
place.Vous devez calculer le total des notes Si c'est SQL 2005, vous pouvez utiliser CTE
la source
Vous devez regrouper sur le champ de note. Cette requête devrait vous donner ce que vous recherchez dans à peu près n'importe quelle base de données.
Vous devez spécifier le système que vous utilisez.
la source
Je l'utilise simplement chaque fois que j'ai besoin de calculer un pourcentage.
Notez que 100.0 renvoie des décimales, alors que 100 à lui seul arrondira le résultat au nombre entier le plus proche, même avec la fonction ROUND ()!
la source
Ce qui suit devrait fonctionner
EDIT: déplacé
* 100
et ajouté le1.0
pour s'assurer qu'il ne fait pas de division entièrela source
C'est, je crois, une solution générale, même si je l'ai testée à l'aide d'IBM Informix Dynamic Server 11.50.FC3. La requête suivante:
donne la sortie suivante sur les données de test indiquées sous la règle horizontale. La
ROUND
fonction peut être spécifique au SGBD, mais le reste (probablement) ne l'est pas. (Notez que j'ai changé 100 en 100,0 pour m'assurer que le calcul s'effectue en utilisant une arithmétique non entière - DECIMAL, NUMERIC -; voir les commentaires, et merci à Thunder.)la source
la source
Dans n'importe quelle version de serveur SQL, vous pouvez utiliser une variable pour le total de toutes les notes comme ceci:
la source
Vous pouvez utiliser une sous-sélection dans votre requête from (non testée et vous ne savez pas laquelle est la plus rapide):
Ou
Ou
Vous pouvez également utiliser une procédure stockée (excuses pour la syntaxe Firebird):
la source
J'ai eu un problème similaire à celui-ci. vous devriez être en mesure d'obtenir le résultat correct en multipliant par 1,0 au lieu de 100 Voir l'exemple Image ci-jointe
Sélectionnez Grade, (Count (Grade) * 1.0 / (Select Count (*) From MyTable)) comme Score From MyTable Group By Grade
la source
Celui-ci fonctionne bien dans MS SQL. Il transforme varchar en résultat d'un flottant limité à deux décimales.
la source