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 :

Comment ajouter des lignes dans une requête via un compteur incrémental


Sujet :

Développement SQL Server

  1. #1
    FMJ
    FMJ est déconnecté
    Membre averti
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    416
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 416
    Points : 356
    Points
    356
    Par défaut Comment ajouter des lignes dans une requête via un compteur incrémental
    Bonjour et très bonne année à tous,

    Le titre n'est pas très explicite mais le besoin est très très simple. Je dispose d'une table référençant le nombre de pièces de chaque étage d'un immeuble, de la forme :
    Etage NbPièces
    0 12
    1 27
    3 9
    4 87
    ......

    Je souhaite juste en sortir une requête qui fournisse le résultat suivant, par exemple pour le 3eme étage :
    Etage pièce
    3 1
    3 2
    3 3
    3 .....
    3 9

    Ma solution actuelle, c'est de créer une table temporaire avec une seule colonne COMPTEUR et de la remplir via un WHILE de 1 à 99, puis de faire une jointure avec la table des étages où COMPTEUR <= NbPièces.
    Cela marche comme attendu mais je pense qu'il doit exister une méthode plus élégante, qui surtout ne passe pas par une table temporaire.
    Merci d'avance pour vos suggestions.

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Vous pouvez aussi utiliser une requête récursive ... mais

    ... mais avoir modélisé une table dont l'une des colonne est le résultat d'un calcul est une erreur, il fallait modéliser une relation entre immeuble et pièce et calculer quand nécessaire le nombre de pièces de l'immeuble.

    Ce d'autant plus que rien ne garantit que les n° de pièces ne comportent pas des trous ou des doublons, par exemple
    Pièce P1, P2, P4a, P4b, P6...
    Ce genre de trous et doublons de numérotation est fréquent dans les hôtels ou les campings par exemple (suite à des réaménagements, travaux etc...)

    Donc si vous le pouvez, corrigez votre modèle de données

  3. #3
    FMJ
    FMJ est déconnecté
    Membre averti
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    416
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 416
    Points : 356
    Points
    356
    Par défaut
    Bonjour et merci pour ta réponse.

    Concernant le CTE, aurais-tu une piste à me soumettre car je ne vois pas très bien comment arriver au résultat escompté ? Merci d'avance.

    Concernant la remarque sur les doublons, de trou etc. , en fait j'ai donné un exemple simplifié car en fait il ne s'agit pas du tout de pièces. Et dans mon cas réel, il n'y a ni trou ni doublon.

    (en revenant à l'exemple des pièces) En fait j'ai suivi une approche par nombre max de pièces car cela ne correspond que quelques dizaines de lignes contre des dizaines de milliers pour une approche où il y a une pièce par ligne (et en fait c'est un volume d'information qui ne m'apporte rien).

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Quelque chose comme ça : (la première CTE ne me sert que pour créer les cas de tests)
    Ci dessous j'ai limité à 100 le nombre de pièces maxi, à adapter si besoin

    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
    WITH CTE1 (ETG, NBP) AS                              
        (SELECT 0, 12  
         UNION ALL                                       
         SELECT 1, 27  
         UNION ALL                                       
         SELECT 3, 09  
         UNION ALL                                       
         SELECT 4, 87)           
       , CTE2 (SEQ) AS                                   
        (SELECT 1
         UNION ALL                                       
         SELECT SEQ+1   FROM CTE2                        
         WHERE SEQ <100)                                 
    SELECT T1.ETG, T2.SEQ                                
    FROM CTE1 T1                                         
    INNER JOIN CTE2 T2                                   
       ON T2.SEQ < T1.NBP+1                             
    ORDER BY T1.ETG, T2.SEQ

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Vous pouvez aussi garder votre fonctionnement actuel,mais en faisant de votre table temporaire une vraie table, peuplée une bonne fois pour toutes, une simple table des nombres.

    Une autre alternative à la CTE récursive, et de vous appuyer sur n'importe quelle table (ayant plusieurs lignes) et de générer les nombres voulus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    WITH Nombre as (
        SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS N
        FROM sys.objects AS o, sys.objects AS o2 
    )
    SELECT N
    FROM Nombre
    ;

Discussions similaires

  1. Numérotation des lignes dans une requête
    Par zoom61 dans le forum Access
    Réponses: 5
    Dernier message: 24/10/2006, 10h35
  2. ajouter des données dans une requête htttp en js
    Par jeromejanson dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 18/10/2005, 15h34
  3. Ajouter des CHAMPS dans une table via ASP
    Par hysteresis dans le forum Access
    Réponses: 1
    Dernier message: 27/09/2005, 15h39
  4. Réponses: 14
    Dernier message: 22/09/2005, 16h49
  5. [SQL server] Comment Fusionner des données dans une requête
    Par MoTUmBo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/07/2005, 15h24

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