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

Oracle Discussion :

[SQL] Ordre d'affichage des lignes d'un état


Sujet :

Oracle

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2006
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 75
    Points : 35
    Points
    35
    Par défaut [SQL] Ordre d'affichage des lignes d'un état
    Bonjour,

    Au sein d'une table, je dispose d'un ensemble de mouvements : des enregistrement initiaux et leurs mouvements complémentaires associés.

    Lors d'une extraction, j'aimerais parvenir à organiser ma requête de manière à remonter les informations sous la structure suivante :

    Premier mouvement initial
    Premier mouvement lié au premier mouvement initial
    Deuxième mouvement lié au premier mouvement initial
    ...
    Deuxième mouvement initial
    Premier mouvement lié au deuxième mouvement initial
    Deuxième mouvement lié au deuxième mouvement initial
    ...
    Etc ...
    En triant in fine chacun de ces blocs par ordre chronologique de création des mouvements initiaux

    Voici également la vision base de données :

    - Chaque enregistrement initial a une date de création Dat_Cre, un identifiant unique Ide_Enr renseigné et un identifiant de référence Ide_Ref à null,
    - Chaque enregistrement complémentaire a une date de création Dat_Cre, l'identifiant unique Ide_enr renseigné et l'identifiant de référence Ide_Ref valorisé avec l'Ide_Enr de l'enregistrement initial auquel il se rapporte.

    Et schématiquement, le résultat souhaité pour ma requête SQL :

    Dat_Cre |Ide_Enr | Ide_Ref
    -------------------------------------
    10/01/06----1
    12/01/06----2-----------1
    13/01/06----3-----------1

    12/01/06----4
    13/01/06----5-----------4
    17/01/06----6-----------4

    15/01/06----7
    25/01/06----8-----------7

    J'ai séparé les différents blocs pour plus de visibilité.

    Merci pour votre aide.

    Fabien

  2. #2
    Membre confirmé
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Points : 562
    Points
    562
    Par défaut
    Normalement Avec la syntaxe SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "Start With Connect By"
    Vous devez pouvoir vous en sortir ==> Recherche
    Signé : Capitaine Jean-Luc Picard

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 138
    Points : 166
    Points
    166
    Par défaut
    Order siblings by aussi

  4. #4
    Nouveau membre du Club
    Inscrit en
    Novembre 2005
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 37
    Points : 25
    Points
    25
    Par défaut
    Dans votre cas, je pense qu'il n'est même pas nécessaire d'utiliser le connect by :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select TO_CHAR(Dat_Cre, 'DD/MM/RR') || RPAD('-',10,'-') || Ide_Enr || decode(Ide_Ref, NULL, NULL, RPAD('-',10,'-') || Ide_Ref)  
    from nom_table
    order by Ide_Enr, Ide_Ref

  5. #5
    Nouveau membre du Club
    Inscrit en
    Février 2006
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 75
    Points : 35
    Points
    35
    Par défaut
    Merci beaucoup pour toutes vos suggestions.

    Malheureusement, ayant manqué de précision dans mon exemple, elles ne permettent pas de résoudre mon problème. En effet, les champs Ide_Enr et Ide_Ref sont définis en varchar2. Voici donc la situation telle qu'elle peut se produire et le résultat que je souhaite obtenir :

    Dat_Cre--- |Ide_Enr -----| Ide_Ref
    -------------------------------------
    12/01/06----Mvt A
    13/01/06----An Mvt A--------Mvt A
    17/01/06----An 2 Mvt A7---- Mvt A

    10/01/06----Mvt B
    12/01/06----An Mvt B4------Mvt B
    13/01/06----An 2 Mvt B9----Mvt B

    15/01/06----Mvt C
    25/01/06----An Mvt C--------Mvt C

    Comment faire dans ce cas de figure pour conserver, sans perdre la hiérarchie de dépendance source-référence, la chronologie sur les mouvements pour lesquels Ide_Ref est null.

    Merci encore pour votre aide

  6. #6
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    T'as pas déjà posé cette question ?
    http://www.developpez.net/forums/viewtopic.php?t=458634
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  7. #7
    Nouveau membre du Club
    Inscrit en
    Février 2006
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 75
    Points : 35
    Points
    35
    Par défaut
    Pas exactement, je n'avais pas mentionné de critère de date sur ce cas là.

  8. #8
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    C'est pas compliqué
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM MATABLE
    ORDER BY NVL(ide_ref, ide_enr), dat_cre
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  9. #9
    Nouveau membre du Club
    Inscrit en
    Février 2006
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 75
    Points : 35
    Points
    35
    Par défaut
    J'y avais déjà pensé mais dans ce cas, il n'y a pas de chronologie conservée par rapport à la date de création Dat_Cre des mouvements initiaux (Ide_Ref à null).

    Je reprends ce que je souhaite voir s'afficher à l'écran :

    Dat_Cre--- |Ide_Enr -----| Ide_Ref
    -------------------------------------
    10/01/06----Mvt B
    12/01/06----An Mvt B4------Mvt B
    13/01/06----An 2 Mvt B9----Mvt B

    12/01/06----Mvt A
    13/01/06----An Mvt A--------Mvt A
    17/01/06----An 2 Mvt A7---- Mvt A

    15/01/06----Mvt C
    25/01/06----An Mvt C--------Mvt C

    A noter ausi que je suis sous Oracle 8.1.5 et donc que la syntaxe start with/connect by avec la clause order by SIBLINGS n'existe pas.

  10. #10
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Ok, j'avais pas compris vu ton exemple de 11h05.

    En 8.1.5, tu as droit aux fonctions analytiques ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT  *
    FROM (
    		SELECT dte, ide_enr, ide_ref,  
    				MIN(dte) OVER(PARTITION BY NVL(ide_ref, ide_enr)) AS dte_orig
    		FROM MATABLE
    		ORDER BY NVL(ide_ref, ide_enr)
    		) Q
    ORDER BY Q.dte_orig, Q.dte
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  11. #11
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT a.*, (SELECT dat_cre
    		FROM MATABLE b
    		WHERE b.ide_enr = NVL(a.ide_ref, a.ide_enr) 
    		AND b.ide_ref IS NULL) ze
    FROM MATABLE  a
    ORDER BY ze, a.dat_cre
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  12. #12
    Nouveau membre du Club
    Inscrit en
    Février 2006
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 75
    Points : 35
    Points
    35
    Par défaut
    Non, je n'ai pas droit aux fonctions analytiques.

    Quant au 2nd bout de code, on perd toute la hiérarchie ci-dessous :

    Premier mouvement initial
    Premier mouvement lié au premier mouvement initial
    Deuxième mouvement lié au premier mouvement initial
    ...
    Deuxième mouvement initial
    Premier mouvement lié au deuxième mouvement initial
    Deuxième mouvement lié au deuxième mouvement initial
    ...
    Etc ...

    T'as fait le test avec les infos que j'ai communiquées et le résultat attendu ??

  13. #13
    Nouveau membre du Club
    Inscrit en
    Février 2006
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 75
    Points : 35
    Points
    35
    Par défaut
    Voici donc mon jeu d'essais : une table nommée 'Enregistrements' avec 3 colonnes 'Dat_Cre', 'Ide_Enr' et 'Ide_Ref' et par exemple les 8 enregistrements suivants :

    10/01/06----Mvt B
    12/01/06----Mvt A
    12/01/06----An Mvt B4------Mvt B
    13/01/06----An Mvt A--------Mvt A
    13/01/06----An 2 Mvt B9----Mvt B
    15/01/06----Mvt C
    17/01/06----An 2 Mvt A7---- Mvt A
    25/01/06----An Mvt C--------Mvt C

    Avec les requêtes proposées, voilà ce que j'obtiens :

    Dat_Cre--- |Ide_Enr -----| Ide_Ref
    -------------------------------------
    12/01/06----Mvt A
    13/01/06----An Mvt A--------Mvt A
    17/01/06----An 2 Mvt A7---- Mvt A

    10/01/06----Mvt B
    12/01/06----An Mvt B4------Mvt B
    13/01/06----An 2 Mvt B9----Mvt B

    15/01/06----Mvt C
    25/01/06----An Mvt C--------Mvt C

    On s'aperçoit ici que la ligne n°4 a été saisie avant la n°1, il faudrait donc réussir à inverser les 2 premiers blocs pour obtenir :

    Dat_Cre--- |Ide_Enr -----| Ide_Ref
    -------------------------------------
    10/01/06----Mvt B
    12/01/06----An Mvt B4------Mvt B
    13/01/06----An 2 Mvt B9----Mvt B

    12/01/06----Mvt A
    13/01/06----An Mvt A--------Mvt A
    17/01/06----An 2 Mvt A7---- Mvt A

    15/01/06----Mvt C
    25/01/06----An Mvt C--------Mvt C

    Encore merci pour votre patience et votre aide.

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 138
    Points : 166
    Points
    166
    Par défaut
    Donner un describe de la table, ça aide toujours.

    Sans mention de version, c'est difficile aussi. Le problème peut être très facilement résolu en utilisant la clause hiérarchique du SQL. Par contre, si ce n'est pas le cas, Faudrait s'y faire autrement.

  15. #15
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT a.*, (	SELECT dte 
    			FROM mc_tri b
    			WHERE b.ide_enr = NVL(a.ide_ref, a.ide_enr) 
    			AND b.ide_ref IS NULL) ze
    FROM mc_tri a
    ORDER BY ze, a.dte
    DTE IDE_ENR IDE_REF ZE
    10/01/2006 MVT B 10/01/2006
    12/01/2006 An Mvt B4 MVT B 10/01/2006
    13/01/2006 An2 Mvt B MVT B 10/01/2006
    12/01/2006 MVT A 12/01/2006
    13/01/2006 An Mvt A MVT A 12/01/2006
    17/01/2006 An2 Mvt A MVT A 12/01/2006
    15/01/2006 MVT C 15/01/2006
    25/01/2006 An Mvt C MVT C 15/01/2006
    Donc chez moi ça marche bien
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  16. #16
    Nouveau membre du Club
    Inscrit en
    Février 2006
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 75
    Points : 35
    Points
    35
    Par défaut
    Effectivement, ça marche bien avec les valeurs que j'ai données mais dans le cas où 2 mouvements initiaux sont créés à la même date soit :

    10/01/06----Mvt B
    12/01/06----Mvt A
    12/01/06----An Mvt B4------Mvt B
    13/01/06----An Mvt A--------Mvt A
    13/01/06----An 2 Mvt B9----Mvt B
    12/01/06----Mvt C
    17/01/06----An 2 Mvt A7---- Mvt A
    25/01/06----An Mvt C--------Mvt C

    on perd totalement la hiérarchie :

    DTE IDE_ENR IDE_REF ZE
    10/01/2006 MVT B 10/01/2006
    12/01/2006 An Mvt B4 MVT B 10/01/2006
    13/01/2006 An2 Mvt B MVT B 10/01/2006
    12/01/2006 MVT A 12/01/2006
    12/01/2006 MVT C 12/01/2006
    13/01/2006 An Mvt A MVT A 12/01/2006
    17/01/2006 An2 Mvt A MVT A 12/01/2006
    25/01/2006 An Mvt C MVT C 15/01/2006

    et ça ne marche plus !!! Je sais, je suis pénible, vraiment navré de vous relancer systémtiquement ...

  17. #17
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Rhaaaaa, t'es pénible c'est vrai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT a.dte, a.IDE_ENR, a.IDE_REF 
    FROM MC_TRI a 
    ORDER BY (	SELECT dte || NVL(ide_ref, ide_enr)
    			FROM MC_TRI b 
    			WHERE b.ide_enr = NVL(a.ide_ref, a.ide_enr) 
    			AND b.ide_ref IS NULL), 
     			a.dte
    DTE IDE_ENR IDE_REF
    10/01/2006 MVT B
    12/01/2006 An Mvt B4 MVT B
    13/01/2006 An2 Mvt B MVT B
    12/01/2006 MVT A
    13/01/2006 An Mvt A MVT A
    17/01/2006 An2 Mvt A MVT A
    12/01/2006 MVT C
    25/01/2006 An Mvt C MVT C
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par McM
    Rhaaaaa, t'es pénible c'est vrai
    +1, surtout qu'on est 2 (au moins) à se casser la tête sur le même problème mais sur des topic différents
    C'est vraiment un manque de respect pour les bénévoles qui aident, merci d'en tenir compte à l'avenir !

    Forum SQL : verouillé
    http://www.developpez.net/forums/viewtopic.php?t=462329
    "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

  19. #19
    Membre habitué
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Points : 151
    Points
    151
    Par défaut
    Salut.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT M.Dat_Cre, M.Ide_Enr, M.Ide_Ref
      FROM Mouvement M
      LEFT JOIN Mouvement P
        ON ( P.Ide_Enr = M.Ide_Ref )
      ORDER BY
    ( Case 
        When M.Ide_Ref Is Null Then ( M.Dat_Cre || M.Ide_Enr )
        Else                        ( P.Dat_Cre || P.Ide_Enr || M.Ide_Ref || M.Dat_Cre )
      End
    )
    +1, surtout qu'on est 2 (au moins) à se casser la tête sur le même problème mais sur des topic différents Evil or Very Mad
    C'est vraiment un manque de respect pour les bénévoles qui aident, merci d'en tenir compte à l'avenir !
    Xo: ++1

  20. #20
    Nouveau membre du Club
    Inscrit en
    Février 2006
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 75
    Points : 35
    Points
    35
    Par défaut
    Mille excuses pour le multi-post. C'est la première fois que j'utilisais ce forum et je n'en connais encore pas bien les règles. Ca ne se reproduira plus, d'autant plus que contrairement à ce que tu as pu dire, j'ai beaucoup de respect pour tous les bénévoles qui contribuent à résoudre ces problématiques. Merci à vous.

    Encore une petite interrogation par rapport à la dernière réponse : est-ce que la syntaxe order by case when ... est valable sous Oracle 8.1.5. Elle ne semble pas tolérée sur notre plate-forme ???

    Etant donné que j'ai reçu 2 solutions, 1 sur le topic Oracle et l'autre sur la rubrique Sql, je clos ma demande tout de suite après ...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/08/2014, 18h00
  2. Réponses: 1
    Dernier message: 29/01/2014, 16h51
  3. [XL-2007] inverser ordre affichage des lignes dans TCD
    Par issoram dans le forum Conception
    Réponses: 2
    Dernier message: 04/07/2012, 16h51
  4. Ordre d'affichage des lignes d'une table
    Par laurentSc dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 21/09/2011, 23h05
  5. [Reports 6] Ordre d'affichage des lignes d'un état
    Par duboisfa dans le forum Reports
    Réponses: 2
    Dernier message: 17/02/2006, 16h21

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