Multi tables avec GROUP BY, COUNT et SUM

Eléphant du PHP | 97 Messages

15 juin 2006, 11:00

Bonjour,

Je reviens avec un problème de requete que j'améliore de jour en jour mais pour laquelle je bloque de nouveau.

Peut on dans une même requete remonter une somme d'un champ, mais aussi le nombre d'enregistrement pour ce champ ?

Et peut on aussi créer une sous requete qui remonte une info pour chaque enregistremet ?

Je redonne les infos des tables :

JEUNE =>
CODE_JEUNE, NOM_JEUNE, PRENOM_JEUNE

ABSENCE_CONSTATEE =>
CODE_JEUNE, NB_CRENEAU, CODE_GROUPE, CODE_MOTIF_ABS

GROUPES =>
CODE_GROUPE, NOM_GROUPE

MOTIF_ABSCENCE =>
CODE_MOTIF_ABS, ABS_JUSTIFIE

L'idée est de recupérer Jeune par Jeune :
- le nombre d'abscence (nombre d'enregistrement du CODE_JEUNE dans ABSENCE_CONSTATEE),
- le cumul d'abscence (Somme de NB_CRENEAU dans ABSENCE_CONSTATEE pour un CODE_JEUNE),
- le cumul d'abscence justifié (Somme de NB_CRENEAU dans ABSENCE_CONSTATEE pour un CODE_JEUNE ayant un CODE_MOTIF_ABS qui dans MOTIF_ABSCENCE à un ABS_JUSTIFIE = "O"),
- et d'avoir aussi le nom du groupe (relation entre CODE_GROUP et NOM_GROUP).

ça marche avec :

$Sql          = "SELECT j.CODE_JEUNE, j.NOM_JEUNE, j.PRENOM_JEUNE, 
SUM(a.NB_CRENEAU) AS heures 
FROM JEUNE j 
INNER JOIN  ABSENCE_CONSTATEE a  ON a.CODE_JEUNE = j.CODE_JEUNE 
WHERE j.CODE_JEUNE < 10 
GROUP BY  j.CODE_JEUNE, j.NOM_JEUNE, j.PRENOM_JEUNE";

mais pour avoir le nombre (un COUNT couplé avec le SUM), je n'y parviens pas.
De même je ne parviens à mettre dans le select le relation pour le nom du groupe sans avoir une erreur "Dynamic SQL Error SQL error code = -104 invalid column reference in"

cf. post http://www.phpfrance.com/forums/voir_sujet-19441-30.php

Merci à tous, je galère vraiment là.

Eléphant du PHP | 140 Messages

15 juin 2006, 11:52

Je te conseille reellement de lire un livre sur le SQL ou de relire en details les reponses que l'on t'a donné dans l'autre post.

Avant d'ecrire une requete, il faut que tu te poses la question de savoir a quelle table elle s'applique a la base et demarrer ta requete par cette table.
Ici, tu veux calculer une somme d'absences et un nombre d'absence... pourquoi donc demarres tu ta requete sur la table jeune ?
Il faut que tu te poses la question de savoir ce que tu veux obtenir avant GROUP BY.
- est-ce une liste de jeunes avec une absence associee ?
- ou est-ce une liste d'absences avec leur jeune associee ?

De maniere generale, quand meme, je pense que si tu veux te lancer dans le SQL il faut une base theorique minimum. Et je pense reellement qu'un livre de SQL t'aiderait beaucoup.

Eléphant du PHP | 97 Messages

15 juin 2006, 11:58

j'ai déjà des infos sur le SQL mais c'est juste que là je mélange tout.

et oui en effet je veux remonter les absences avec le jeune en question mais en groupant par jeune.

Eléphant du PHP | 140 Messages

15 juin 2006, 12:09

j'ai déjà des infos sur le SQL mais c'est juste que là je mélange tout.
Pour faire des requetes autres qu'un simple SELECT, tu n'y arriveras pas sans plus d'infos.
et oui en effet je veux remonter les absences avec le jeune en question mais en groupant par jeune.
Donc commence ta requete par la table absences :)

Eléphant du PHP | 97 Messages

11 juil. 2006, 09:41

Bonjour,

Je reviens à la charge car voila plusieurs semaines que je galère sur ce problème.

J'ai fait la requete suivante:
$Sql          = "SELECT j.CODE_JEUNE, j.NOM_JEUNE, j.PRENOM_JEUNE, a.CODE_MOTIF_ABS,  
SUM(a.NB_CRENEAU) AS heures 
FROM JEUNE j 
INNER JOIN  ABSENCE_CONSTATEE a  ON a.CODE_JEUNE = j.CODE_JEUNE 
WHERE j.CODE_JEUNE < 10 
GROUP BY  j.CODE_JEUNE, j.NOM_JEUNE, j.PRENOM_JEUNE, a.CODE_MOTIF_ABS";
Mais dès que je veux des informations sur le GROUPE, ma requete ne marche plus :
$Sql          = "SELECT j.CODE_JEUNE, j.NOM_JEUNE, j.PRENOM_JEUNE, j.CODE_GROUPE, a.CODE_MOTIF_ABS,  
SUM(a.NB_CRENEAU) AS heures 
FROM JEUNE j 
INNER JOIN  ABSENCE_CONSTATEE a  ON a.CODE_JEUNE = j.CODE_JEUNE 
WHERE j.CODE_JEUNE < 10 
GROUP BY  j.CODE_JEUNE, j.NOM_JEUNE, j.PRENOM_JEUNE, a.CODE_MOTIF_ABS, j.CODE_GROUPE";
Warning: ibase_query() [function.ibase-query]: Dynamic SQL Error SQL error code = -206 Column unknown J.CODE_GROUPE in D:\www\xxx\xxx\xxx_absences.php on line 130
:idea:

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

11 juil. 2006, 09:44

Si je reprend la structure des tables il n'y a pas de colonne CODE_GROUPE dans la table JEUNES...

Sinon ce serait mieux de ne suivre qu'un sujet à la fois, il en est où celui-là ?
http://www.phpfrance.com/forums/voir_sujet-19557.php

Eléphant du PHP | 97 Messages

11 juil. 2006, 09:49

C'est la même problématique.
Mais dans les réponses le sujet partait vers une discussion des différences entre Oracle, Mysql et Interbase. J'avais donc à l'époque créé un nouveau sujet.
Si je reprend la structure des tables il n'y a pas de colonne CODE_GROUPE dans la table JEUNES...
Non, c'est dans ABSENCE_CONSTATEE en effet. C'est recopiant que je fait l'erreur.

Quoi quil en soit en prenant la requete dans tous les sens ej ne parviens pas à résoudre mes problèmes. Je me mlange de plsu en plus les pinces.