[SQL] Double compte sur 2 tables en 1 requete [résolu]

Double compte sur 2 tables en 1 requete [résolu] [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 27-03-2019 à 16:35:51    

Bonjour,
J'ai 2 tables:
Cours : avec les champs id,nom, niveau etc...
Inscrits: avec les champs id, id_cours, rôle...
 
Je voudrai le nombre de cours ayant un certain nombre d'inscrits, trier par nombre d'inscrits
Exemple :
Cours.id (1,2,3,4,5,6,7,8,9)
Inscrits.id_cours(1,1,1,2,2,2,3,3,4,4,5,5,6,6,7,8,9)  
3 inscrits au cours 1, 3 inscrits au cours 2, 2 inscrits au cours 3 etc...
soit : 2 cours avec 3 inscrits, 3 cours avec 2 inscrits et 3 cours avec 1 inscrit
je voudrai obtenir :
NB cours     NB inscrits
2                3
3                2
3                1
 
Quand j'écris :
SELECT count(co.id) as nb_cours, count(inscr.id) as Nb_inscrits
FROM cours as co
OUTER JOIN inscrits AS inscr
ON co.id = incr.contextid
 
bein, cela ne marche pas... sinon, je ne poserai pas la question...
 
Auriez-vous une idée ?
Amicalement,
AR94


Message édité par ar94 le 28-03-2019 à 09:54:30
Reply

Marsh Posté le 27-03-2019 à 16:35:51   

Reply

Marsh Posté le 27-03-2019 à 22:26:16    

Et avec ça ?
SELECT t.NB AS NBINSCRITS, COUNT(t.id) AS NBCOURS FROM
(SELECT c.id, count(i.id) AS NB FROM Cours c LEFT JOIN Inscrits i ON (c.id = i.id_cours) GROUP BY c.id) AS t
GROUP BY t.NB
ORDER BY t.NB DESC


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 28-03-2019 à 09:45:21    

Bonjour,
Merci pour la réponse rapide et surtout pour la requête.
J'étais à des km de cette écriture.
Cela donne les résultats voulus.
Maintenant, je vais regarder de plus près comment elle fonctionne.
Amicalement,
AR94

Reply

Marsh Posté le 28-03-2019 à 10:33:40    

Ben en gros, pour chaque cours, on compte le nb d'inscrits : c'est ce que fait la sous-requête dans le FROM. Le LEFT JOIN permet d'avoir les cours pour lesquels t'as 0 inscrits. Si tu ne veux pas des 0, tu remplaces le LEFT JOIN par un INNER JOIN.
La requête principale exploite la sous-requête et compte le nb de cours qui ont le même nb d'inscrits puis on ordonne le résultat par taille décroissante du nb d'inscrits.
Edit : ta requête risquait pas de marcher car à aucun moment tu indiques comment tu veux faire ton regroupement (tes 2 count). Si tu utilises des fonctions d'agrégation (count, sum, min, max, avg...) tu dois forcément utiliser le GROUP BY pour indiquer comment tu veux agréger les données :o


Message édité par rufo le 28-03-2019 à 10:35:38

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed