Problème : Requêtes sans résultat

Problème : Requêtes sans résultat - SQL/NoSQL - Programmation

Marsh Posté le 12-05-2007 à 10:30:18    

Bonjour;
Je suis sous mysql server 5 et je travaille avec mysql browser.
J'ai fait 4 requêtes qui ne donnent aucune ligne en résultat et il n' y a pas de message d'erreur non plus.
Cela fait 2 heures que je cherche la source d'erreur.
Pouvez-vous me dire si vous voyez des fautes de logique?
Le mpd donne une table compte (contenant id_etudiant, le montant des factures, montant des versements, no_facture...) reliée à une table étudiant (contenant id_etudiant, le nom_etudiant ...) elle-même (etudiant) reliée  à une table inscription (contenant id_etudiant, id_cursus, no_inscription...) elle-même (inscription) reliée à une table cursus (contenant id_cursus, nom_cursus, prix_cursus...).
D'avance merci.
 

Code :
  1. VI. Listez le total des factures faites aux étudiants regroupées par cursus en montrant les id_cursus et les noms de cursus
  2. SELECT c.id_cursus, c.nom_cursus,
  3. COUNT(co.no_facture) 'Total factures'
  4. FROM compte co, cursus c, etudiant e, inscription i
  5. WHERE co.id_etudiant = e.id_etudiant
  6. AND e.id_etudiant = i.id_etudiant
  7. AND i.id_cursus = c.id_cursus
  8. GROUP BY c.id_cursus;
  9. VII. A partir de la requête précédente, ajoutez une colonne indiquant le total qui devrait être facturé en faisant référence au prix du cursus
  10. SELECT c.id_cursus, c.nom_cursus, c.prix_cursus,
  11. COUNT(co.no_facture) 'Total factures',
  12. SUM(co.montant_facture) 'Total à facturer'
  13. FROM compte co, cursus c, etudiant e, inscription i
  14. WHERE co.id_etudiant = e.id_etudiant
  15. AND e.id_etudiant = i.id_etudiant
  16. AND i.id_cursus = c.id_cursus
  17. GROUP BY c.id_cursus;
  18. VIII. Faites un état des comptes étudiants ; on veut voir les noms, le total des factures, celui des versements et le solde de chaque compte
  19. SELECT e.nom_etudiant,
  20. SUM(co.montant_facture) 'Total factures',
  21. SUM(co.montant_versement) 'Total versements',
  22. (SUM(co.montant_facture) - SUM(co.montant_versement)) 'SOLDE'
  23. FROM compte co, etudiant e
  24. WHERE co.id_etudiant = e.id_etudiant
  25. GROUP BY e.nom_etudiant;
  26. IX. A partir de la requête précédente, n’éditez plus que les comptes créditeurs (qui ont plus payé qu’ils ne sont facturés)
  27. SELECT e.nom_etudiant,
  28. SUM(co.montant_facture) 'Total factures',
  29. SUM(co.montant_versement) 'Total versements',
  30. (SUM(co.montant_facture) - SUM(co.montant_versement)) 'COMPTES CREDITEURS'
  31. FROM compte co, etudiant e
  32. WHERE co.id_etudiant = e.id_etudiant
  33. GROUP BY e.nom_etudiant
  34. HAVING (SUM(co.montant_facture) - SUM(co.montant_versement)) < 0;

Reply

Marsh Posté le 12-05-2007 à 10:30:18   

Reply

Marsh Posté le 12-05-2007 à 15:30:18    

Il me semble que la clause group by devrait contenir toutes les colonnes sauf celle du count(). Par exemple pour la première requête, il faudrait essayer avec ...GROUP BY c.id_cursus, c.nom_cursus;

Reply

Marsh Posté le 13-05-2007 à 19:47:54    

Salut olivthill;
S'il faut que je regroupe par Group By c.id_cursus, c.nom_cursus; pour la première requête (question 6), est-ce qu'il faudra alors que pour la seconde requête (question 7) que je regroupe par Group By c.id_cursus, c.nom_cursus, c.prix_cursus; ?
Qu'en est-il pour les autres requêtes les colonnes où il y a les données générées par les fonction sum et count n'ont pas besoin  de regroupement?
Merci.

Reply

Marsh Posté le 13-05-2007 à 19:53:09    

lorsque tu fais un group by, cette clause doit contenir tous les champs de ton select qui ne sont pas des fontions d'agregats.
 
edit :  
et donc oui pour la 7, il faudrai faire ce que tu as dit.
Ainsi que pour toutes les autres. Tu dois mettre dans ton group by tous tes champs autres que sum() et count()


Message édité par gocho le 13-05-2007 à 19:56:34
Reply

Marsh Posté le 13-05-2007 à 20:10:04    

Merci Gocho;
j'ai une autre question: en se référant au MPD je commence à penser que les lignes AND i.id_cursus = c.id_cursus dans le where des questions 7 et 6 sont suprflues qu'en penses-tu?
Concernant les résultats de tables vide je me suis rendu compte en tapant select * from compte; que cette table est complètement vide de lignes.


Message édité par teycir le 13-05-2007 à 20:11:26
Reply

Marsh Posté le 13-05-2007 à 23:49:04    

alors pour le "AND i.id_cursus = c.id_cursus", je ne pense pas qu'il soit inutile.
Sur quoi te bases tu ? (enfin, oui, sur le MPD. Mais qu'est ce qui te fait dire cela ?)
 
C'est  le lien entre les deux tables, si tu n'as pas cette ligne, tu vas faire un produit cartésien entre tes deux tables, et ca va etre moche...
 (c'est à dire que pour chaque compte, le SGBD va faire correspondre tous les etudiants :p)
 
Ensuite, pour la table vide, ben remplis la [:dawa]
 
edit : parce que, effectivement, tester des requetes avec des tables vides, c'est pas le mieux qu'on ait fait [:dawao]


Message édité par gocho le 13-05-2007 à 23:52:17
Reply

Marsh Posté le 14-05-2007 à 09:53:10    

teycir a écrit :

Salut olivthill;
S'il faut que je regroupe par Group By c.id_cursus, c.nom_cursus; pour la première requête (question 6), est-ce qu'il faudra alors que pour la seconde requête (question 7) que je regroupe par Group By c.id_cursus, c.nom_cursus, c.prix_cursus; ?
Qu'en est-il pour les autres requêtes les colonnes où il y a les données générées par les fonction sum et count n'ont pas besoin  de regroupement?
Merci.


- Un sum ou un count a forcément besoin d'agrégation. le group by porte systématiquement sur l'ensemble des champs retournés par la requêtes sauf ceux fasant l'objet d'un agrégat.
 
- Sinon, "Total factures", je ne pense pas que ce soit le nombre total de factures, mais le total de leur montant.

Reply

Marsh Posté le 14-05-2007 à 09:58:58    

Et la VI est complètement fausse du coup : tu vas chercher le prix des factures pour le "à factuer", plutôt que de prendre le montant trouvé dans la table "cursus" comme demandé.

Reply

Sujets relatifs:

Leave a Replay

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