Ressortir la position d'un enregistrement dans une requête SQL

Résolu
warzet Messages postés 44 Date d'inscription lundi 27 août 2007 Statut Membre Dernière intervention 1 novembre 2016 - 3 sept. 2013 à 09:13
warzet Messages postés 44 Date d'inscription lundi 27 août 2007 Statut Membre Dernière intervention 1 novembre 2016 - 25 oct. 2013 à 08:59
Bonjour à tous,
Je voudrais savoir s'il m'est possible de ressortir le numéro de position exacte d'un enregistrement dans une requête SQL? Je m'explique: voici une requête
        private void nbTotalNotes()
        {
            DtSet.Clear();            
            string sAllElevesNotes = "SELECT Conseil_Trimestriel.code_eleve, Eleves.nom_eleve, Eleves.prenom_eleve, Eleves.date_naissance," + "\n" +
            "Annees_Scolaires.annee, Classes.classe, Trimestres.trimestre, Conseil_Trimestriel.total, Conseil_Trimestriel.coefficient," + "\n" +
            "Conseil_Trimestriel.moyenne_trimestrielle, Appreciations.appreciation, Conseil_Trimestriel.observations, Professeur_PP.code_enseignant," + "\n" +
            "Conseil_Trimestriel.date_conseil" + "\n" +
            "FROM Eleves, Professeur_PP, Conseil_Trimestriel, Annees_Scolaires, Classes, Trimestres, Appreciations" + "\n" +
            "WHERE Conseil_Trimestriel.code_annee = Annees_Scolaires.code_annee AND Conseil_Trimestriel.code_classe = Classes.code_classe AND" + "\n" +
            "Conseil_Trimestriel.code_trimestre = Trimestres.code_trimestre AND Professeur_PP.code_enseignant = Conseil_Trimestriel.code_enseignant AND" + "\n" +
            "Eleves.code_eleve = Conseil_Trimestriel.code_eleve AND Conseil_Trimestriel.code_appreciation = Appreciations.code_appreciation" + "\n" +
            "GROUP BY Conseil_Trimestriel.code_eleve, Eleves.nom_eleve, Eleves.prenom_eleve, Eleves.date_naissance, Annees_Scolaires.annee," + "\n" +
            "Classes.classe, Trimestres.trimestre, Conseil_Trimestriel.total, Conseil_Trimestriel.coefficient, Conseil_Trimestriel.date_conseil," + "\n" +
            "Conseil_Trimestriel.moyenne_trimestrielle, Appreciations.appreciation, Conseil_Trimestriel.observations, Professeur_PP.code_enseignant" + "\n" +
            "ORDER BY Conseil_Trimestriel.moyenne_trimestrielle DESC, Annees_Scolaires.annee DESC";
            OleDbDataAdapter Adapt = new OleDbDataAdapter(sAllElevesNotes, strConex);
            try
            {
                //On stock les résultats trouvé dans un DataSet pour les compter
                Adapt.Fill(DtSet, "Conseil_Trimestriel");
                //Adapt.Fill(this.DtsGrid, "Absences");

                //iTotal est egal au count total du nombre de tuple dans ma base
                this.iTotal = DtSet.Tables[0].Rows.Count;

                if (iTotal == 0)
                {
                    this.lblTotal.Text = "Nombre total de Décision de Conseil Enregistrée : " + string.Concat(iTotal.ToString(), " Décision");
                }
                else if (iTotal > 1)
                {
                    this.lblTotal.Text = "Nombre total de Décisions de Conseil Enregistrées : " + string.Concat(iTotal.ToString(), " Décisions");
                }

                //on rempli la liste avec le dataset    
                this.DttGrid = this.DtSet.Tables["Conseil_Trimestriel"];

                //on affiche la liste dans le datagridview
                this.dgvEleves.DataSource = this.DttGrid;
                StyledgvEleves();

                this.Conex.Close();

            }
            catch (FileNotFoundException ex)//(Exception j)
            {
                //MessageBox.Show(j.Message.ToString());
                //MessageBox.Show("Aucune donnée n'est enregistrée dans la Base de données", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                MessageBox.Show(ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }


Est-il possible dans cette requête si je prends un élève quelconque de déterminer et ressortir son rang (classement réel non basé sur le champ id auto-incrémenté) sous forme numérique?
Merci de bien vouloir m'aider.

6 réponses

nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
3 sept. 2013 à 09:58
Salut !
Que veux-tu dire pas "rang"? Car pour moi "classement réel" ne veut rien dire si je ne sais pas ce qu'il représente ^^. (C'est basé sur un calcul? si oui, lequel, que représente t'il? ).

Avec quelques précision je pourrai surement t'aider ^^
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
4 sept. 2013 à 09:17
Bonjour,

Tu cherches le RowNum correspondant au rang de l'enregistrement dans le résultat ?

Tu peux utiliser ça :
int index = dt.Rows.IndexOf(row);


Sébastien
0
warzet Messages postés 44 Date d'inscription lundi 27 août 2007 Statut Membre Dernière intervention 1 novembre 2016
4 sept. 2013 à 09:18
Je te remercie déjà pour m'avoir répondu, alors saches que avec cette requête, je ressorts une liste d'élève avec leur moyenne scolaire ordonnée de la plus grande moyenne vers la plus faible, aussi je voudrais savoir si j'ai la possibilité de créer une colonne pour ressortir un classement, du 1er au dernier, cela est-il possible? Ou alors comment procéder encore à toi NAGASHIMA
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
4 sept. 2013 à 10:49
tu n'es pas obligé de créer une colonne pour cela... il suffit de connaître l'index de la ligne...

Mais sinon, tu peux ajouter row_number() à ta requête (en sql server).

Sébastien
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
4 sept. 2013 à 11:48
salut !

Alors dans ce cas il va falloir que tu regarde différentes choses.

La première sera le "group by" qui te permettra de regrouper ce qui concerne un élément (dans ton cas tu peux grouper par identifiant d'élève).

Ensuite, si, pour faire simple, tu fais :

select id_eleve, moyenne from (
SELECT id_eleve , (SUM(note_eleve) / count(notes_eleve) as moyenne 
FROM notes_eleve
GROUP BY id_eleve) as sous_requete 
order by moyenne desc


Dans mon cas j'imagine posséder une table simple "notes_eleve" qui possède 2 colonnes : un id et une note.

la sous requete :
SELECT id_eleve , (SUM(note_eleve) / count(notes_eleve) as moyenne 
FROM notes_eleve
GROUP BY id_eleve


me permet de regrouper pour 1 identifiant (donc un élève) les notes, "SUM" calcul la somme des notes pour un même identifiant, et "count" renverra le "nombre de lignes". (si il y a 3 notes => ca sera divisé par 3)
à noter que dans mon cas toutes les notes sont à la même echelle (par exemple les notes /20 points).

L'ajouter à une sous requête me permet ensuite de trier ces résultat du plus grand au plus petit grâce au "order by" et le "desc" (=> descendant)



Bien sûr dans ton cas il y a aura probablement d'autres infos à récupérer (comme les noms, prénoms, classes, etc.) mais ca ca sera à toi d'y penser ^^

demande si il y a des choses pas trop clair (ou si ce n'est pas vraiment ce que tu veux..).

naga
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
Modifié par nagashima le 6/09/2013 à 09:58
il manque une parenthèse :
(SUM(note_eleve) / count(notes_eleve) ) as moyenne 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
warzet Messages postés 44 Date d'inscription lundi 27 août 2007 Statut Membre Dernière intervention 1 novembre 2016
6 sept. 2013 à 09:16
Merci Naga
compte tenu du fait que je suis un débutant, pourrais-tu me dire comment introduire le row_number() dans ma requête. Merci
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
6 sept. 2013 à 09:57
Je n'ai jamais utilisé cette fonction, mais si je comprend bien ca permet de rajouter un id incrémenté dans le jeu de résultat ... donc bon je te renvoi sur un lien :
http://msdn.microsoft.com/fr-fr/library/ms186734.aspx

dans ton ca je pense que la syntaxe serai :
ROW_NUMBER() OVER(PARTITION BY Conseil_Trimestriel.code_eleve ORDER BY Conseil_Trimestriel.moyenne_trimestrielle DESC) AS Row


je ne peux pas tester donc il faudra probablement l'adapter
0
warzet Messages postés 44 Date d'inscription lundi 27 août 2007 Statut Membre Dernière intervention 1 novembre 2016
25 oct. 2013 à 08:59
J'ai résolu mon problème simplement en faisant ceci:
        private void Label_Effectifs()
{
//On initialise jMax
if (j <= 9)
{
this.lblPosition.Text = 0 + "" + j + "/" + jMax;
}
else if (j > 9)
{
this.lblPosition.Text = j + "/" + jMax;
}
if ((j <= 9) && (jMax <= 9))
{
this.lblPosition.Text = 0 + "" + j + "/" + 0 + "" + jMax;
}
else if ((j > 9) && (jMax > 9))
{
this.lblPosition.Text = j + "/" + jMax;
}
this.txtClasTrimestre.Text = j.ToString();
}


J'ai donc récupérer dans mon txtClasTrimestre.Text = j.ToStrind(); voilà et le tour est joué. Merci à tous
0
Rejoignez-nous