Ressortir la position d'un enregistrement dans une requête SQL [Résolu]

Messages postés
44
Date d'inscription
lundi 27 août 2007
Dernière intervention
1 novembre 2016
- - Dernière réponse : warzet
Messages postés
44
Date d'inscription
lundi 27 août 2007
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.
Afficher la suite 

Votre réponse

6 réponses

Messages postés
4269
Date d'inscription
samedi 8 septembre 2007
Dernière intervention
29 août 2018
0
Merci
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 ^^
Commenter la réponse de nagaD.scar
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
0
Merci
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
Commenter la réponse de sebmafate
Messages postés
44
Date d'inscription
lundi 27 août 2007
Dernière intervention
1 novembre 2016
0
Merci
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
sebmafate
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
-
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
Commenter la réponse de warzet
Messages postés
4269
Date d'inscription
samedi 8 septembre 2007
Dernière intervention
29 août 2018
0
Merci
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
nagaD.scar
Messages postés
4269
Date d'inscription
samedi 8 septembre 2007
Dernière intervention
29 août 2018
-
il manque une parenthèse :
(SUM(note_eleve) / count(notes_eleve) ) as moyenne 
Commenter la réponse de nagaD.scar
Messages postés
44
Date d'inscription
lundi 27 août 2007
Dernière intervention
1 novembre 2016
0
Merci
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
nagaD.scar
Messages postés
4269
Date d'inscription
samedi 8 septembre 2007
Dernière intervention
29 août 2018
-
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
Commenter la réponse de warzet
Messages postés
44
Date d'inscription
lundi 27 août 2007
Dernière intervention
1 novembre 2016
0
Merci
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
Commenter la réponse de warzet

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.