par
Invité » 09 févr. 2006, 15:31
C'est une requête croisée qui calcule le nombre de mêmes notes attribuées aux élèves par date.
J'ai une proposition qui répond à ce que tu veux faire, mais il faut suivre le raisonnement pour comprendre :
1. Construisons la requête qui affiche la colonne A telque tu veux : c'est à dire où on voit pour une date et un élève le nombre total des notes A.
Par exemple : le 08/02/2005 l'élève 1 à eu 2 notes A.
Voici donc la requête :
SELECT count(note) as A
FROM notes as n
WHERE n.note = "A"
GROUP BY n.date, n.eleve
Regroupement par date et eleve, sélection de la note A ciblée et comptage (count)
Cette requête ne traite donc que les élèves qui ont eu une note A
On peut donc répéter la même requête pour les notes B, C et D pour obtenir leur colonne
Maintenant tout en restant sous SQL, on doit essayer de mixer les différentes colonnes obtenues par les requêtes expliquées précédement.
Commençons par créer l'ossature de la requête finale qui doit construire le tableau croisé qui doit contenir :
une colonne pour les élèves
Les 4 colonnes A, B, C et D pour les comptes des notes (obtenues par les requêtes précédentes)
et finalement la colonne pour les dates
La source de données pour cette requête est notre table notes.
Voici d'abord la requête principale qui extrait les éléves et les dates à partir de la source notes en la triant par date décroissante (exactement comme tu veux)
SELECT eleve, date
FROM notes
GROUP BY date, eleve
ORDER BY date desc
Il faut grouper par date et eleve pour eliminer les couples (date, eleve) en double (puisqu'un même eleve se voit attribuer plusieurs notes dans une même date)
En effet la requête principale effectue ce regroupement pour créer l'ossature du tableau croisé où un élève ne se répéte que si la date change.
Et enfin ajoutons les colonnes A, B, C et D à cette requête pour obtenir le tableau finale.
Sans oublier qu'on a déjà créé les requêtes qui produisent ces colonnes, il il est question maintenant de savoir comment les connecter à la requête principale.
C'est simple, pour connecter par exemple la requête de la colonne A il faut :
1. d'abord l'insérer dans le SELECT de la requête principale (avec les champs "eleve" et "date") en lui attribuant un alias (nom)
Exemple : SELECT eleve, date,
(SELECT ..... ) as A ....
2. connecter la colonne insérée en lui passant comme paramètres les liens nécessaires pour conditionner son traitement.
Dans notre cas toutes les sous-requêtes des colonnes A, B, C et D doivent pointer sur le même élève et date pour synchroniser leur traitement.
Quand une sous-requête de colonne n'arrive pas à compter des notes (puisqu'elle ne fait que ça) dans les conditions précisées par les paramètres, elle renvoit NULL.
Exemple de paramètrage pour connecter la colonne A à la requête principale :
SELECT eleve, date,
(SELECT count(note)
FROM notes
WHERE note = "A"
AND eleve = PRINCIPAL.eleve AND date=PRINCIPAL.date
GROUP BY date, eleve, note) as A
FROM notes as PRINCIPAL
GROUP BY date, eleve
ORDER BY date desc
Dans cet exemple on a ajouté dans la clause WHERE de la colonne A la condition de liaison avec eleve et date da la requête principale.
Ce qui donne par extension, la requête finale qui contient :
L'élève, les 4 colonnes A, B, C et D et la date
SELECT eleve,
(SELECT count(note)
FROM notes
WHERE note = "A" and eleve = PRINCIPAL.eleve and date=PRINCIPAL.date
GROUP BY date, eleve, note) as A ,
(SELECT count(note)
FROM notes
WHERE note = "B" and eleve = PRINCIPAL.eleve and date=PRINCIPAL.date
GROUP BY date, eleve, note) as B ,
(SELECT count(note)
FROM notes
WHERE note = "C" and eleve = PRINCIPAL.eleve and date=PRINCIPAL.date
GROUP BY date, eleve, note) as C ,
(SELECT count(note)
FROM notes
WHERE note = "D" and eleve = PRINCIPAL.eleve and date=PRINCIPAL.date
GROUP BY date, eleve, note) as D ,
date
FROM notes as PRINCIPAL
GROUP BY date, eleve
ORDER BY date desc
C'est une requête croisée qui calcule le nombre de mêmes notes attribuées aux élèves par date.
J'ai une proposition qui répond à ce que tu veux faire, mais il faut suivre le raisonnement pour comprendre :
1. Construisons la requête qui affiche la colonne A telque tu veux : c'est à dire où on voit pour une date et un élève le nombre total des notes A.
Par exemple : le 08/02/2005 l'élève 1 à eu 2 notes A.
Voici donc la requête :
[php]SELECT count(note) as A
FROM notes as n
WHERE n.note = "A"
GROUP BY n.date, n.eleve[/php]
Regroupement par date et eleve, sélection de la note A ciblée et comptage (count)
Cette requête ne traite donc que les élèves qui ont eu une note A
On peut donc répéter la même requête pour les notes B, C et D pour obtenir leur colonne
Maintenant tout en restant sous SQL, on doit essayer de mixer les différentes colonnes obtenues par les requêtes expliquées précédement.
Commençons par créer l'ossature de la requête finale qui doit construire le tableau croisé qui doit contenir :
une colonne pour les élèves
Les 4 colonnes A, B, C et D pour les comptes des notes (obtenues par les requêtes précédentes)
et finalement la colonne pour les dates
La source de données pour cette requête est notre table notes.
Voici d'abord la requête principale qui extrait les éléves et les dates à partir de la source notes en la triant par date décroissante (exactement comme tu veux)
[php]SELECT eleve, date
FROM notes
GROUP BY date, eleve
ORDER BY date desc
[/php]
Il faut grouper par date et eleve pour eliminer les couples (date, eleve) en double (puisqu'un même eleve se voit attribuer plusieurs notes dans une même date)
En effet la requête principale effectue ce regroupement pour créer l'ossature du tableau croisé où un élève ne se répéte que si la date change.
Et enfin ajoutons les colonnes A, B, C et D à cette requête pour obtenir le tableau finale.
Sans oublier qu'on a déjà créé les requêtes qui produisent ces colonnes, il il est question maintenant de savoir comment les connecter à la requête principale.
C'est simple, pour connecter par exemple la requête de la colonne A il faut :
1. d'abord l'insérer dans le SELECT de la requête principale (avec les champs "eleve" et "date") en lui attribuant un alias (nom)
Exemple : SELECT eleve, date, [b](SELECT ..... ) as A ....[/b]
2. connecter la colonne insérée en lui passant comme paramètres les liens nécessaires pour conditionner son traitement.
Dans notre cas toutes les sous-requêtes des colonnes A, B, C et D doivent pointer sur le même élève et date pour synchroniser leur traitement.
Quand une sous-requête de colonne n'arrive pas à compter des notes (puisqu'elle ne fait que ça) dans les conditions précisées par les paramètres, elle renvoit NULL.
Exemple de paramètrage pour connecter la colonne A à la requête principale :
SELECT eleve, date,
(SELECT count(note)
FROM notes
WHERE note = "A"
[b]AND eleve = PRINCIPAL.eleve AND date=PRINCIPAL.date[/b]
GROUP BY date, eleve, note) as A
FROM notes as PRINCIPAL
GROUP BY date, eleve
ORDER BY date desc
Dans cet exemple on a ajouté dans la clause WHERE de la colonne A la condition de liaison avec eleve et date da la requête principale.
Ce qui donne par extension, la requête finale qui contient :
L'élève, les 4 colonnes A, B, C et D et la date
[php]SELECT eleve,
(SELECT count(note)
FROM notes
WHERE note = "A" and eleve = PRINCIPAL.eleve and date=PRINCIPAL.date
GROUP BY date, eleve, note) as A ,
(SELECT count(note)
FROM notes
WHERE note = "B" and eleve = PRINCIPAL.eleve and date=PRINCIPAL.date
GROUP BY date, eleve, note) as B ,
(SELECT count(note)
FROM notes
WHERE note = "C" and eleve = PRINCIPAL.eleve and date=PRINCIPAL.date
GROUP BY date, eleve, note) as C ,
(SELECT count(note)
FROM notes
WHERE note = "D" and eleve = PRINCIPAL.eleve and date=PRINCIPAL.date
GROUP BY date, eleve, note) as D ,
date
FROM notes as PRINCIPAL
GROUP BY date, eleve
ORDER BY date desc[/php]