IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

[SQL Server] problème de classement, calcul d'un rang [FAQ]


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Août 2002
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 108
    Points : 46
    Points
    46
    Par défaut [SQL Server] problème de classement, calcul d'un rang
    Bonjour
    pour ma base jutilise sql server 2000.

    - j'ai une table Moyenne dans laquelle je stocke les informations de chaque élève.
    matricule;trimestre;annee;classe; et la moyenne.
    est-il possible de faire une requête SQL qui pourra me classer chaque matricule selon son rang ? afin de l'afficher sur une fiche
    exemple :
    matriule 001 , rang 1er; matricule 002, rang 2eme etc...
    et en même temps traiter les exequo ?

    Merci à tous pour l'aide .
    merci à Médiat pour son éclairage la fois passé

  2. #2
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Un p'tit jeu d'essai en SQL, ça serait sympa, ça éviterait à ceux qui aident d'avoir à le faire

    Voici mon interprétation de ton problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE Eleve (
    Matricule VARCHAR2 (12),
    Moyenne   NUMBER (5,2),
    Classe    VARCHAR2 (12));
     
    INSERT INTO Eleve VALUES ('AA', 12.25, 'Classe 1');
    INSERT INTO Eleve VALUES ('BB', 17.15, 'Classe 1');
    INSERT INTO Eleve VALUES ('CC', 09.45, 'Classe 1');
    INSERT INTO Eleve VALUES ('DD', 13.90, 'Classe 1');
    INSERT INTO Eleve VALUES ('EE', 07.00, 'Classe 2');
    INSERT INTO Eleve VALUES ('FF', 16.50, 'Classe 2');
    INSERT INTO Eleve VALUES ('GG', 16.50, 'Classe 2');
    COMMIT;
    Voici une requête qui classe les éléves toutes classes confondues :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    SELECT Matricule, Moyenne, 
    (SELECT COUNT(*) + 1 FROM Eleve S
     WHERE  P.Moyenne < S.Moyenne) AS Rang
    FROM Eleve P
    ORDER BY Rang ASC;
     
    MATRICULE       MOYENNE       RANG
    ------------ ---------- ----------
    BB                17,15          1
    FF                 16,5          2
    GG                 16,5          2
    DD                 13,9          4
    AA                12,25          5
    CC                 9,45          6
    EE                    7          7
    Et voici la requête qui attribue le rang par classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    SELECT Classe, Matricule, Moyenne, 
    (SELECT COUNT(*) + 1 FROM Eleve S
     WHERE P.Classe = S.Classe AND P.Moyenne < S.Moyenne) AS Rang
    FROM Eleve P
    ORDER BY Classe, Rang ASC;
     
    CLASSE       MATRICULE       MOYENNE       RANG
    ------------ ------------ ---------- ----------
    Classe 1     BB                17,15          1
    Classe 1     DD                 13,9          2
    Classe 1     AA                12,25          3
    Classe 1     CC                 9,45          4
    Classe 2     FF                 16,5          1
    Classe 2     GG                 16,5          1
    Classe 2     EE                    7          3
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 810
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 810
    Points : 52 863
    Points
    52 863
    Billets dans le blog
    5
    Par défaut
    Il suffit de faire une non équi autojointure de la table sur elle même avec un comptage.

    Sans plus d'élément d'information sur votre problème impossible de vous expliquer plus en avant.

    Si vous voulez plus d'aide, reespectez ceci :
    http://www.developpez.net/forums/showthread.php?t=944

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Membre du Club
    Inscrit en
    Août 2002
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 108
    Points : 46
    Points
    46
    Par défaut Probleme de classement
    En fait je donne plus de précisios
    le nom de la table :moyenne
    composé des champs matricule;classe;trimestre;annee;moyenne_trim donc 4 champs.

    je dois editer les bulletins de chaque eleve et mettre son rang dessus.
    l'edition des bulletions se fait à travers le choix triplet : classe,trimestre,annee.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     SELECT matricule_elev,moyenne_trim,
        (SELECT COUNT(*) + 1 from MOYEN_ELEV_TRIM S
        WHERE P.matricule_elev = S.matricule_elev AND P.moyenne_trim <    S.moyenne_trim) AS Rang
    FROM MOYEN_ELEV_TRIM P
    and P. code_trim=:trim
    and P. code_annee=:annee
    and P. num_classe=:clas
     
    ORDER BY RANG ASC


    la requete ne marche pas.
    merci d'avance pour l'eclairage

  5. #5
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Tu as un message d'erreur ? Si oui lequel ?
    Ou aucun enregistrement correspondant ? Si oui va nous falloir un jeu de données ...
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  6. #6
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    Bonsoir,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT 	matricule_elev,
    	moyenne_trim,
        	(
    	SELECT COUNT(*) + 1 
    	FROM MOYEN_ELEV_TRIM S
        	WHERE  P.matricule_elev = S.matricule_elev 	
                 AND P.moyenne_trim < S.moyenne_trim
    	) AS Rang
    FROM 	MOYEN_ELEV_TRIM P
    AND 	P. code_trim=:trim
    AND 	P. code_annee=:annee
    AND 	P. num_classe=:clas
    ORDER BY RANG ASC;
    Pour classer les moyennes, ta rq compte ttes les moyennes supérieures à celle courante.
    Avec la ligne en gras, jamais ça peut marcher !!!

    A +

  7. #7
    Membre du Club
    Inscrit en
    Août 2002
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 108
    Points : 46
    Points
    46
    Par défaut Probleme de classement
    Bonjour

    Le message que je rçois quand j'execute la requete est :
    ''objet parameter defini de manière incorrecte , des infos incohérentes ou incompltes ont été fournie''

    une précision: c'est quand j'ajoute le triplet : classe,trimestre,annee que ça merde. c'est à dire pour editer les bulletins d'une classe, je dois entrer:
    la classe, le trimestre et l'annee.
    exemple : classe 01
    trimestre 02
    annee 01
    je n'arrive pas à faire fonctionner la requête du tout.

    Merci d'avance pour l'aide

  8. #8
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par lepeule
    Le message que je rçois quand j'execute la requete est :
    ''objet parameter defini de manière incorrecte , des infos incohérentes ou incompltes ont été fournie''
    C'est un message SQL Server ? Je crois qu'on n'est plus dans le SQL ...

    Citation Envoyé par lepeule
    une précision: c'est quand j'ajoute le triplet : classe,trimestre,annee que ça merde. c'est à dire pour editer les bulletins d'une classe, je dois entrer:
    la classe, le trimestre et l'annee.
    exemple : classe 01
    trimestre 02
    annee 01
    je n'arrive pas à faire fonctionner la requête du tout.
    Citation Envoyé par SQLPro
    Il suffit de faire une non équi autojointure de la table sur elle même avec un comptage.
    Pour faire une équi jointure, il faut bien reprendre dans la sous-requête les mêmes critères classe, trimestre et année que dans la requête principale.
    J'avais simplifié dans mon exemple en ne gérant que la notion de classe, il te suffisait d'étendre aux 2 autres critères, comme ceci je pense :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT matricule_elev, moyenne_trim, 
           (SELECT COUNT(*) + 1 FROM Eleve S
             WHERE P.code_trim = S.code_trim 
               AND P.code_annee = S.code_annee
               AND P.num_classe = S.num_classe
               AND P.moyenne_trim < S.moyenne_trim) AS Rang
      FROM Eleve P
     WHERE P.code_trim = :trim
       AND P.code_annee = :annee
       AND P.num_classe = :clas
     ORDER BY Rang ASC;
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  9. #9
    Membre du Club
    Inscrit en
    Août 2002
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 108
    Points : 46
    Points
    46
    Par défaut probleme de classement
    Bonsoir
    j'ai essaye cette requete mais toujours le même message d'erreur
    ''objet parameter defini de manière incorrecte des info incohérentes ou incomplete ont été fournis''

    Je ne sais pas comment corriger l'erreur
    merci d'avance

    [
    SELECT matricule_elev, moyenne_trim,
    (SELECT COUNT(*) + 1 FROM Eleve S
    WHERE P.code_trim = S.code_trim
    AND P.code_annee = S.code_annee
    AND P.num_classe = S.num_classe
    AND P.moyenne_trim < S.moyenne_trim) AS Rang
    FROM Eleve P
    WHERE P.code_trim = :trim
    AND P.code_annee = :annee
    AND P.num_classe = :clas
    ORDER BY Rang ASC;
    ]

  10. #10
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Ca ne m'a pas l'air d'être une erreur SQL ?

    Est-ce que la requête suivante, avec des valeurs "en dur" fonctionne ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT matricule_elev, moyenne_trim, 
           (SELECT COUNT(*) + 1 FROM Eleve S
             WHERE P.code_trim = S.code_trim 
               AND P.code_annee = S.code_annee
               AND P.num_classe = S.num_classe
               AND P.moyenne_trim < S.moyenne_trim) AS Rang
      FROM Eleve P
     WHERE P.code_trim = '02'
       AND P.code_annee = '01'
       AND P.num_classe = '01'
     ORDER BY Rang ASC;
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  11. #11
    Membre du Club
    Inscrit en
    Août 2002
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 108
    Points : 46
    Points
    46
    Par défaut problème de classement
    Bonjour

    avec ça tout va bien.

    [WHERE P. code_trim='02'
    AND P. code_annee='02'
    AND P. num_claase='02'
    ][/]
    ça marche bien.

    mais quand je mets les paramètres :
    [
    WHERE P.num_classe=:classe
    and P. code_trim=:trim
    and P. code_annee=:annee
    ][

    l'erreur s'affiche tourjour la meme erreur.'objet parameter ......'

    je signale que l'utilisateur doit pourvoir choisir à tout moment le choix pour une impression donnée. c'est à dire une classe donnéé; un trimestre donne; une annee scolaire donnee.

    Merci d'avance

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Guinée

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juin 2017
    Messages : 19
    Points : 6
    Points
    6
    Par défaut
    Bonjour Chez moi il signal toujours l'erreur au niveau de la fonction Count(*) aidez moi

  13. #13
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 199
    Points : 39 103
    Points
    39 103
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Plutôt que de rebondir sur un sujet qui date de 2006, ouvrez une nouvelle discussion et communiquez la requête exécutée, le résultat obtenu et le message d'erreur.

Discussions similaires

  1. Réponses: 11
    Dernier message: 18/10/2007, 12h49
  2. [SQL Server 2000]Utiliser un Champs calculé pour en calculé un autre.
    Par PadawanDuDelphi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/03/2007, 10h05
  3. [SQL Server] Calcul durée entre 2 dates sans les dimanches
    Par sarahsonia dans le forum Langage SQL
    Réponses: 6
    Dernier message: 03/04/2006, 17h59
  4. changer la collation (classement) de sql server 2000
    Par timsah dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 07/12/2005, 12h03
  5. update pour calcul pourcentage (SQL SERVER 2000)
    Par meufeu dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/09/2005, 09h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo