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

Développement SQL Server Discussion :

Retourner le rang des résultats sous SQLServer 2000


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 82
    Par défaut Retourner le rang des résultats sous SQLServer 2000
    Bonjour,

    J'ai un jeu de données équivalent à cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Numero_Compte         Groupe          Montant
    1001                         A                 1000
    1002                         B                 2300
    1003                         A                 1500
    1004                         C                 1000
    1005                         A                 1200
    1006                         C                 1500
    1007                         C                 2000
    1008                         B                 1400
    et je cherche à donner le rang de chaque compte au sein de chaque groupe (le plus grand montant correspondant au rang 1)

    soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Numero_Compte         Groupe          Montant          Rang_Groupe
    1003                         A                 1500              1
    1005                         A                 1200              2
    1001                         A                 1000              3
    1002                         B                 2300              1
    1008                         B                 1400              2
    1007                         C                 2000              1
    1006                         C                 1500              2
    1004                         C                 1000              3
    Quelqu'un aurait-il une idée de la manière dont il faut s'y prendre ?
    Merci d'avance

  2. #2
    Membre émérite Avatar de Arkhena
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 552
    Par défaut
    Bonjour,

    Je ne suis pas experte, mais je ferai un truc comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Numero_Compte, 
      Groupe, 
      Montant, 
      ROW_NUMBER() OVER(PARTITION BY Groupe ORDER BY Montant) AS Rang_Groupe
    FROM maTable
    Cordialement,

    Arkhena

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Il n'y a pas de fonctions analytiques avec SQL Server 2000, mais on voit bien l'utilité d'upgrader ses bases de données car effectivement la requête est nettement plus simple avec.
    Attention au sens du tri, il faudrait faire un "ORDER BY Montant DESC" dans ce cas.

    Voici deux solutions.
    Avec une requête scalaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      select MT1.Numero_Compte, MT1.Groupe, MT1.Montant,
             (select count(*) from MaTable AS MT2
              where MT2.Groupe = MT1.Groupe
              and MT2.Montant >= MT1.Montant) as Rang_Groupe
        from MaTable AS MT1
    order by MT1.Groupe ASC,
             Rang_Groupe ASC;
    Avec une jointure (je préfère cette solution) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      select MT1.Numero_Compte, MT1.Groupe, MT1.Montant,
             count(*) AS Rang_Groupe
        from MaTable AS MT1
             INNER JOIN MaTable AS MT2
                ON MT2.Groupe = MT1.Groupe
               and MT2.Montant >= MT1.Montant
    group by MT1.Numero_Compte, MT1.Groupe, MT1.Montant
    order by MT1.Groupe ASC,
             Rang_Groupe ASC

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 82
    Par défaut
    arf, oui, je suis bien tombé sur les fonctions analytiques en cherchant un peu mais malheureusement, je n'ai pas la bonne version de SQLServer (et ce n'est pas moi qui prend la décision d'upgrader...)

    j'avais essayé la scalaire avant de poser la question, et j'avais eu des résultats bizarres, je pensais que j'avais faux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Numero_Compte	Groupe	Montant	Rang
    34193	          A	        4661	         1
    44894	          A	        6268	         1
    39048	          A	        4222	         3
    45048	          A	        4094	         4
    ...
    43440	          AP	         341	         17
    54739	          ASC	         2252	         2
    61045	          ASC	         2252	         2
    84931	          ASC	         2154	         3
    61142	          ASC	         1587	         4


    Avec la jointure, je n'ai pas le même résultat mais en regardant dans le détail il y a encore des choses qui clochent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Numero_Compte	Groupe	Montant	Rang
    81602	         S	         976	         12
    82012	         S	         987	         12
    Une idée de quoi ça pourrait provenir ?

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Oui vous n'avez pas précisé comment vous souhaitez gérer les égalités (le cas dans le groupe ASC).
    Par contre sur le groupe A, c'est peut-être du un problème d'espace ou de caractère invisible.

    Pour le groupe S, effectivement c'est étrange.

    Pouvez-vous fournir un jeu de données sur vos données réelle sur un groupe ou deux qui pose problème (une vingtaine de lignes par groupe maximum par contre) ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 82
    Par défaut
    Peut-être aurais-je dû préciser que je travaille à partir d'une autre query (pour faire du sum par numéro de compte), je ne sais pas si cette information est pertinente

    les données (j'avais tronqué les décimales pour une meilleure lisibilité) :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    Compte   Group	  Montant
    23441	A	755,95656
    28972	A	1293,1123
    28973	A	388,515569
    32091	A	2875,866
    34193	A	4661,968
    39048	A	4222,322
    40082	A	1704,2694
    42908	A	3759,192
    43440	A	341,1185
    43523	A	2325,3192
    44288	A	499,47
    44600	A	1839,1524
    44894	A	6268,168
    45048	A	4094,229
    45246	A	1964,252
    46530	A	626,9996
    47225	A	2502,353
    47368	A	1150,895
    37237	S	312,123
    39156	S	309,65827
    45230	S	615,719
    45841	S	365,9673
    46531	S	576,6831
    47181	S	1450,2132
    48753	S	79,2658
    49553	S	923,2749
    50759	S	138,9952
    50760	S	169,6536
    52001	S	314,1073
    52557	S	106,76316
    52761	S	469,9118
    53126	S	350,267
    54071	S	591,9545
    54411	S	444,4285
    54739	S	2252,167
    55371	S	79,9059
    55527	S	677,3717
    55923	S	815,6583
    57748	S	740,1626
    Merci en tout cas

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 82
    Par défaut
    ah oui, et il n'y a pas de bug quand je demande le rang de chaque compte sur l'ensemble et non par groupe

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Job d'optimisation sous SQLServer 2000 - PRIMARY GROUP is full
    Par Romain.pelissier dans le forum MS SQL Server
    Réponses: 24
    Dernier message: 30/10/2007, 15h30
  2. Comment afficher le rang des résultats d'une requête sous Access 2002
    Par painpepper dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 15/08/2007, 02h19
  3. Journalisation sous SqlServer 2000
    Par freud dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 02/07/2007, 01h43
  4. Comment stocker des images en SQLSERVER(2000)
    Par rddev dans le forum Accès aux données
    Réponses: 1
    Dernier message: 27/04/2007, 23h58

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