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 :

Combler les "trous" d'une séquence


Sujet :

Langage SQL

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 097
    Points : 41 087
    Points
    41 087
    Billets dans le blog
    62
    Par défaut Combler les "trous" d'une séquence
    Bonjour,

    je sèche sur ce problème sauf à passer par des procédures mais il y a peut être un moyen plus simple.

    Travaillant dans le domaine de la mode j'ai affaires à une saisonnalité des commandes et plusieurs lignes de produits (on pourrait aussi dire marques)
    or un client ne commande pas toujours toutes les lignes de Produits pour une saison et pas forcément toutes les saisons
    et enfin l'entreprise peut avoir de nouvelles lignes de Produits ou en abandonner

    comment alors récupérer des statistiques qui se tiennent alors que je peut avoir des "trous" ? en bonus on ne peut vouloir que les n à n-3 saisons c.a.d dans l'exemple suivant à partir de 16

    Exemple
    SAISON LIGNE_PRODUIT
    12 DA
    -- Manque saison 13,14
    -- Manque Lignes Produits DA pour la saison 15
    15 EX
    15 HE
    15 SL
    -- Abandon de la ligne SL
    -- Manque Lignes Produits DA pour la saison 16
    16 EX
    16 HE
    -- Manque Lignes Produits DA pour la saison 17
    17 EX
    17 HE
    -- Manque Lignes Produits DA pour la saison 18
    18 EX
    18 HE
    18 OP << nouvelle ligne
    -- Saison 19 ok
    19 DA
    19 EX
    19 HE
    19 OP
    etc...
    idéalement je veux obtenir
    -- n-3
    16 DA
    16 EX
    16 HE
    16 OP
    -- n-2
    17 DA
    17 EX
    17 HE
    17 OP
    -- n-1
    18 DA
    18 EX
    18 HE
    18 OP
    -- n
    19 DA
    19 EX
    19 HE
    19 OP
    Je ne suis pas assez calé en requête récursive pour savoir si c'est possible, une idée pour ce casse-tête ?

    P.S. J'ai bien sûr simplifié à l'extrême ne serait-ce que pour l'identification des saisons qui en fait ressemble plutôt à ça : E2016,2016E,E016O
    E2016 contenant 2 Lignes de Produits HE et EX,2016E une seule DA de même que E016O avec OP et pourtant tout cela concerne l'ETE 2016
    une petite cuisine interne me permet d'affecté un nombre hiérarchique par saison d'où le chiffre de la colonne

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

    et pourquoi pas construire une CTE qui contient toutes les combinaisons de saisons et lignes de produit, puis faire une jointure outer de cette CTE vers la table des commandes et ainsi identifier les trous ?

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 097
    Points : 41 087
    Points
    41 087
    Billets dans le blog
    62
    Par défaut
    C'est justement cette CTE qui me pose problème, bien que j'arrive à faire cet "compilation" de combinaisons via une procédure, je pense qu'il doit y avoir plus "élégante"

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 300
    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 300
    Points : 39 641
    Points
    39 641
    Billets dans le blog
    9
    Par défaut
    Il n'existe pas une table contenant la liste des saisons et une autre la liste des lignes de produits ?
    Faute de table, si la liste est relativement courte et surtout qu'elle est stable, un bon vieux select "en dur" (from dual ou équivalent) des valeurs requises peut faire l'affaire

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 097
    Points : 41 087
    Points
    41 087
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Il n'existe pas une table contenant la liste des saisons et une autre la liste des lignes de produits ?
    si bien sûr, les deux, mais en ce qui concerne les lignes de produits je ne veux que ceux concernant le client "au moins une fois dans la tranche à étudier"
    Faute de table, si la liste est relativement courte et surtout qu'elle est stable, un bon vieux select "en dur" (from dual ou équivalent) des valeurs requises peut faire l'affaire
    Oui, je penche vers cette solution, en fait la nuit portant conseil, je m’aperçois que je ne passe pas par le bon bout pour cette partie, obnubilé par la partie "client" j'ai l'impression d'être passé à coté de quelque chose, le "FULL JOIN" en faisant partie.

    Je vais reprendre ma partition

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 097
    Points : 41 087
    Points
    41 087
    Billets dans le blog
    62
    Par défaut
    Voilà le résultat de mes cogitations, conforme à ma demande
    j'ai préféré finalement le faire dans une procédure pour le passage des paramètres
    comme je n'ai parlé que de saison et de Ligne de Produit, la CTE L n'est pas tout fait celle utilisée en réalité, mais c'est la partie qui me posait soucis

    N.B. il s'agit d'une base Firebird , mais comme il s'agissait d'un truc plus généraliste CTE RECURSIVE ....
    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
    SET TERM ^ ;
    CREATE PROCEDURE STATS_SAISONS (
        CLIENT Char(5),
        SAISONREF Char(5),
        TRANCHE Smallint )
    RETURNS (
        S Smallint,
        LP Char(2),
       ... )
    AS
    BEGIN
     FOR
     WITH RECURSIVE NS (S,SEQ) AS (SELECT TRUNC(EAN13/10) AS S,1 AS SEQ FROM NUMUNIQUE WHERE CODE='CDEC' AND SAISON=:SAISONREF
                             UNION ALL 
                             SELECT S-1,SEQ+1 FROM NS WHERE SEQ<:TRANCHE
                            ),              
     
                L AS (SELECT DISTINCT COALESCE(M.LIGNE_PRODUIT,'**') LP FROM LCMDCLI L JOIN ECMDCLI E ON L.SAISON_CMDE=E.SAISON_CMDE AND L.NUM_CMDE=E.NUM_CMDE
                                                              JOIN NUMUNIQUE N ON N.CODE='CDEC' AND N.SAISON=L.SAISON_CMDE
                                                              LEFT JOIN MODELES M ON l.MODELE=M.NOM 
               WHERE E.NUM_CLIENT=:CLIENT 
               AND  TRUNC(N.EAN13/10) BETWEEN (SELECT TRUNC(EAN13/10)-6 FROM NUMUNIQUE WHERE CODE='CDEC' AND SAISON=:SAISONREF)
                                          AND (SELECT TRUNC(EAN13/10) FROM NUMUNIQUE WHERE CODE='CDEC' AND SAISON=:SAISONREF) 
              )    
     
      SELECT NS.S,L.LP FROM NS FULL JOIN L ON 1=1 ORDER BY 1,2 INTO :S,:LP
      DO SUSPEND;  
    END^
    SET TERM ; ^
    une seule question, subsidiaire, je ne crois pas que le ORDER BY du SELECT soit vraiment une bonne chose et pense qu'il vaut mieux l'utiliser lors de l'interrogation de la procédure

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 300
    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 300
    Points : 39 641
    Points
    39 641
    Billets dans le blog
    9
    Par défaut
    Je préfère ne pas me prononcer sur les procédures que je n'ai guère eu l'occasion de pratiquer
    Seul l'order by 1,2 me fait un peu tiquer, car risqué en cas de maintenance, mieux vaut remplacer par les noms de colonnes

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

Discussions similaires

  1. Combler les trous d'autoNum
    Par Stéphane Olivier BERNARD dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 10/10/2007, 16h25
  2. combler les trous d'un id sous mysql
    Par D.Mounir dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 02/05/2007, 10h29
  3. Compléter les trous d'une requête groupée sur une durée
    Par apoingsfermes dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/01/2007, 19h47
  4. recuperer les minimum d'une séquence d'entiers?
    Par novice12 dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 25/01/2005, 03h44
  5. Combler les trous lors d'une suppression dans une table
    Par Billybongjoe dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 08/04/2004, 14h02

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