Comment obtenir de multiples chefs d'accusation avec une requête SQL?
Je me demande comment l'écrire cette requête.
Je sais réels de cette syntaxe est faux, mais il vous aidera à comprendre ce que je suis désireux.
J'ai besoin d'elle dans ce format, car il fait partie d'un beaucoup plus grand requête.
SELECT distributor_id,
COUNT(*) AS TOTAL,
COUNT(*) WHERE level = 'exec',
COUNT(*) WHERE level = 'personal'
J'ai besoin de cette renvoyés dans une requête.
Aussi, il le besoin d'être dans une ligne, de sorte que le suivant ne fonctionne pas:
'SELECT distributor_id, COUNT(*)
GROUP BY distributor_id'
- A cette requête de vous travaillé correctement ??
SELECT distributor_id, COUNT(*) AS TOTAL, COUNT(*) WHERE level = 'exec', COUNT(*) WHERE level = 'personal'
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser un
CASE
déclaration avec une fonction d'agrégation. C'est en gros la même chose qu'unPIVOT
de la fonction dans certains SGBDR:COUNT
compteradistributor_id
sage . pas toutes les lignes de la table, à droite ?distributor_id
depuis l'est de la colonne de regroupement.distributor_id
, alors vous n'êtes pas raconter le moteur exactement ce que vous voulez. Alors que la requête puisse fonctionner sans elle, MySQL peut retourner une valeur incorrecte pour ledistributor_id
, voir comment MySQL gère Group By. Je préfère être précis et assurez-vous qu'il est de retour ce que je m'attends à chaque fois.GROUP BY
autant que les OP de la situation et de la réponse est concerné. L'ajout deGROUP BY
à la fin génère deux lignes répartis par groupes et ne montre pas le nombre total de lignes.dans la table. Mais encore une fois, je ne peux pas vérifier pour MySQL.D'une manière qui fonctionne pour vous
EDIT:
Voir @KevinBalmforth de la décomposition de la performance pour laquelle il est probable que vous ne souhaitez pas utiliser cette méthode et devraient plutôt opter pour @bluefeet de réponse. Je pars de ce que les gens puissent comprendre leurs options.
sum(case...)
solution doit être envisagée.group by
avec l'avantage de remplacer l'ensemble d'une requête imbriquée avec un simplecount(*)
comme @Mihai montre - avec plus de MySQL uniquement la syntaxe des simplifications.COUNT
ne compte quenon null
valeurs et lesDECODE
sera de retour non nulle valeur1
seulement si votre condition est satisfaite.distributor_id
sera la requête show ? Il montre 1 ligne au total.Pour mysql, cela peut être réduit à
Construire sur d'autres réponses.
À la fois de ceux-ci produisent les valeurs de droite:
Cependant, la performance est tout à fait différent, ce qui va évidemment être plus pertinent, car la quantité de données augmente.
J'ai trouvé que, en supposant qu'aucun des indices ont été définis sur la table, la requête à l'aide de la Somme serait de faire une simple analyse de la table, tandis que la requête avec les Comtes serait de faire plusieurs analyses de la table.
Comme un exemple, exécutez le script suivant:
Mettre en évidence les 2 instructions de sélection et cliquez sur Afficher le Plan d'Exécution Estimé icône. Vous verrez que la première déclaration d'un tableau d'analyse et la deuxième va faire 4. Évidemment, une analyse de la table est mieux que 4.
L'ajout d'un index cluster est également intéressante. E. g.
La première SÉLECTIONNER ci-dessus va faire un Index Cluster unique d'Analyse. Le second SELECT 4 Index Cluster Cherche, mais ils sont toujours plus cher qu'un Index Cluster unique d'Analyse. J'ai essayé la même chose sur une table avec 8 millions de lignes et la deuxième sélection a été encore beaucoup plus cher.
Bien, si vous devez avoir tout ça dans une requête, vous pourriez faire de l'union:
Ou, si vous pouvez le faire après le traitement:
Vous obtiendrez le nombre de chaque niveau et le besoin de la somme de tous pour obtenir le total.
UNION
être très utile lors de la génération d'un rapport contenant plusieurs instances de laCOUNT(*)
fonction.#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ') FROM distributors UNION SELECT COUNT() AS EXEC_COUNT FROM distributors WHERE ' at line 1
.- Je faire quelque chose comme ça où je viens de donner à chaque table une chaîne de nom pour l'identifier dans la colonne A, et le nombre de colonne. Ensuite, j'ai de l'union de toutes sorte qu'ils se cumulent. Le résultat est plutôt à mon avis - pas sûr de savoir comment elle est efficace par rapport à d'autres options, mais il m'a fait ce dont j'avais besoin.
Résultat:
a query that I created makes ...
- où est cette requête ?Basé sur Bluefeet de réponse acceptée avec une nuance à l'aide de PLUS de ()
À l'aide de
OVER()
avec rien dans le () vous donnera le nombre total pour l'ensemble du jeu de données.Je pense que cela peut travaille aussi pour vous
select count(*) as anc,(select count(*) from Patient where sex='F')as patientF,(select count(*) from Patient where sex='M') as patientM from anc
et également vous pouvez sélectionner et comte de tables liées, comme ce
select count(*) as anc,(select count(*) from Patient where Patient.Id=anc.PatientId)as patientF,(select count(*) from Patient where sex='M') as patientM from anc