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 :

requete sur une section avec que la borne minimale


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
    Developper
    Inscrit en
    Juin 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Developper

    Informations forums :
    Inscription : Juin 2008
    Messages : 55
    Par défaut requete sur une section avec que la borne minimale
    Bonjour,

    Je suis avec SQL Server.
    J'ai une table comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CodeSociete - CodeTarif - Echelon Min
    -------------------------------------
    12              -   1           -        0
    12              -   2           -       10
    12              -   3           -       30
    12              -   4           -       60
    19              -   1           -       100
    19              -   3           -       200
    Est ce qu'il est possible avec une seule requete SQL d'avoir dans le résultat la borne min et la borne max immédiatement superieur (9999 si n'existe pas)
    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CodeSociete - CodeTarif - Echelon Min - Echelon Min
    ----------------------------------------------------
    12              -   1           -        0        -     10
    12              -   2           -       10        -     30
    12              -   3           -       30        -     60
    12              -   4           -       60        -      9999
    19              -   1           -       100      -     200
    19              -   3           -       200     -     9999

    J'ai essayé, ça fonctionne si il n'y a que 2 ligne par société, mais bien sur, dès qu'on en a plus, ça commence à plus aller.

    ma requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select TableTest.CodeSociete, TableTest.CodeTarif, TableTest.EchelonMin, 
    CASE WHEN RR.EchelonMAX IS NULL THEN 9999 ELSE RR.EchelonMAX END,
     from 
    TableTest 
    LEFT JOIN (SELECT CodeSociete, CodeTarif, EchelonMin as EchelonMAX FROM TableTest) as RR
    ON TableTest.CodeSociete = RR.CodeSociete
    AND TableTest.CodeTarif = RR.CodeTarif
    AND TableTest.EchelonMin < RR.EchelonMAX
    J'aimerai éviter d'avoir a faire des curseurs... mais je me demande si c'est possible

    Merci

    Geoffroy

  2. #2
    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 : 47
    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
    Si vous êtes en version au moins 2005, vous pouvez utiliser une fonction de fenêtrage pour calculer une position de votre ligne (j'ai trié par code tarif, mais c'est à vous de définir la bonne règle), puis de faire une jointure externe sur la même table :
    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
    With MaTable (CodeSociete, CodeTarif, EchelonMin) AS
    (
    select 12, 1,   0 union all
    select 12, 2,  10 union all
    select 12, 3,  30 union all
    select 12, 4,  60 union all
    select 19, 1, 100 union all
    select 19, 3, 200
    )
      ,  TableNum (CodeSociete, CodeTarif, EchelonMin, rn) AS
    (
    select CodeSociete, CodeTarif, EchelonMin,
           row_number() over(partition by CodeSociete order by CodeTarif asc)
      from MaTable
    )
      select mt1.CodeSociete, mt1.CodeTarif, mt1.EchelonMin,
             coalesce(mt2.EchelonMin, 9999) as EchelonMax
        from TableNum as mt1
             left outer join TableNum as mt2
               on mt2.CodeSociete = mt1.CodeSociete
              and mt2.rn          = mt1.rn + 1
    order by mt1.CodeSociete asc, mt1.CodeTarif asc;
     
    CodeSociete CodeTarif   EchelonMin  EchelonMax
    ----------- ----------- ----------- -----------
    12          1           0           10
    12          2           10          30
    12          3           30          60
    12          4           60          9999
    19          1           100         200
    19          3           200         9999

  3. #3
    Membre confirmé
    Profil pro
    Developper
    Inscrit en
    Juin 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Developper

    Informations forums :
    Inscription : Juin 2008
    Messages : 55
    Par défaut
    Merci pour votre réponse, mais je suis sous SQL Server 2000.

    Je ne connaissais pas la la fonction de fenêtrage, mais je ne comprend pas l'intérêt dans mon cas si dans les parenthèses du WITH...AS il faut écrire en dur les lignes puisque elles ne sont pas figées.

    Tant pis, je vais faire un curseur...

  4. #4
    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 : 47
    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 faudra envisager une migration quand même un jour, vous travaillez avec 10 ans de retard !

    En fonction des critères nécessaires (que vous n'avez pas précisé), la solution suivante pourrait fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      SELECT mt1.CodeSociete, mt1.CodeTarif, mt1.EchelonMin,
             coalesce(min(mt2.EchelonMin), 9999) AS EchelonMax
        FROM MaTable AS mt1
             LEFT OUTER JOIN MaTable AS mt2
               ON mt2.CodeSociete = mt1.CodeSociete
              AND mt2.CodeTarif   > mt1.CodeTarif
    GROUP BY mt1.CodeSociete, mt1.CodeTarif, mt1.EchelonMin
    ORDER BY mt1.CodeSociete ASC, mt1.CodeTarif ASC;
    Cette solution suppose que vous triez par CodeTarif ET que les échelons sont forcément croissants par CodeSociete / CodeTarif.

    PS : le with servait juste à recréer vos données, mais ça n'existe pas en MSSQL 2000.

  5. #5
    Membre confirmé
    Profil pro
    Developper
    Inscrit en
    Juin 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Developper

    Informations forums :
    Inscription : Juin 2008
    Messages : 55
    Par défaut
    Merci beaucoup je vais tester ça.

    C'est clair qu'on devrait migrer, mais on traine. La base est assez volumineuse en nombre d'objets avec 160 tables, 110 procédures stockées, des triggers, des vues... (Même si certains membres du forum vont trouver ça ridicule)

    Il faut qu'on teste sérieusement la migration à 2008. Même si le risque d'incompatibilité est limité, j'imagine qu'on ne peut pas migrer les yeux fermés... et comme tout le monde, on manque de temps.

    Geoffroy

  6. #6
    Membre confirmé
    Profil pro
    Developper
    Inscrit en
    Juin 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Developper

    Informations forums :
    Inscription : Juin 2008
    Messages : 55
    Par défaut
    C'est résolu !

    Merci infiniment

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

Discussions similaires

  1. [AC-2003] Requete sur une table avec des "Left Join" en parallèle
    Par Currahee dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 27/08/2009, 09h37
  2. Réponses: 4
    Dernier message: 04/02/2009, 19h09
  3. Requete SUM sur une table avec critère sur une autre
    Par wail00 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/05/2007, 16h58
  4. [SQL2K]Requete sur une chaine avec une ou plusieurs quote
    Par tazamorte dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 17/04/2007, 08h22
  5. Réponses: 4
    Dernier message: 23/10/2006, 09h09

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