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 :

[Oracle] Ordre d'affichage de lignes d'une requête


Sujet :

Langage SQL

  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 [Oracle] Ordre d'affichage de lignes d'une requête
    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
      0  0

  2. #2
    Membre actif Avatar de TheRussian
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 200
    Points : 241
    Points
    241
    Par défaut
    Bonjour,

    moi je modifierai les enregistrements initiaux avec :
    Ide_Enr = Ide_Ref

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

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

    comme cela un simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select Dat_Cre, Ide_Enr, Ide_Ref 
    from MaTable
    order by Dat_Cre, Ide_Ref, Ide_Enr
      0  0

  3. #3
    Invité
    Invité(e)
    Par défaut
    Salut

    Je ne sais pas sur quel SGBD tu es mais avec Access il faudrait faire une ORDER BY sur Ide_Enr et ensuite un ORDER BY sur le Dat_Cre et un ORDER BY sur le Ide_Ref dans cet ordre


    Starec
      0  0

  4. #4
    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
    Si je reprends ton exemple,

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

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

    ta solution ne fonctionne pas car en triant par Dat_Cre, Ide_Ref, Ide_Enr, tu regrouperais les lignes 2 et 4, or je veux conserver ces 2 blocs bien distincts. De toute façon, je ne peux en aucun cas renseigner Ide_Ref

    Concernant la proposition pour Access, je suis personnellement sous Oracle mais cela ne change pas grand chose. Par contre, j'ai une petite précision à apporter sur ma schématisation : Ide_Enr n'est pas forcément croissant :

    Dat_Cre |Ide_Enr | Ide_Ref
    -------------------------------------
    10/01/06----1
    12/01/06----4-----------1
    13/01/06----9-----------1

    12/01/06----2
    13/01/06----3-----------4
    17/01/06----7-----------4

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

  5. #5
    Membre actif Avatar de TheRussian
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 200
    Points : 241
    Points
    241
    Par défaut
    je ne peux en aucun cas renseigner Ide_Ref
    Si la valeur est NULL, peut-être que ceci pourrait faire l'affaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select Dat_Cre, Ide_Enr, nvl(Ide_Ref,Ide_Enr)  as Ide_Ref
    from MaTable
    order by nvl(Ide_Ref,Ide_Enr), Ide_Enr
      0  0

  6. #6
    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
    Plutôt avec order by nvl(Ide_Ref,Ide_Enr), Ide_Ref, c'est ce que je fais actuellement. Quoi qu'il en soit, il manque un critère de tri : la date. Et je ne sais pas comment en tenir compte ...

    Merci pour voitre aide en tout cas
      0  0

  7. #7
    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 duboisfa
    Dat_Cre |Ide_Enr | Ide_Ref
    -------------------------------------
    10/01/06----1
    12/01/06----4-----------1
    13/01/06----9-----------1

    12/01/06----2
    13/01/06----3-----------2
    17/01/06----7-----------2

    15/01/06----5
    25/01/06----8-----------5
    J'ai corrigé les valeurs en rouge, tu as mélangé les Ide_Enr sans impacter les Ide_Ref

    C'est possible, avec un UNION par exemple :

    Voici mon TESTCASE :
    (Dat_Cre est en VARCHAR2, c'est pour éviter de me taper les TO_DATE ...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE Table Mouvement (
    Dat_Cre VARCHAR2(10),
    Ide_Enr NUMBER(2),
    Ide_Ref NUMBER(2));
     
    INSERT INTO Mouvement VALUES ('2006/01/10', 1, NULL);
    INSERT INTO Mouvement VALUES ('2006/01/12', 4, 1);
    INSERT INTO Mouvement VALUES ('2006/01/13', 9, 1);
    INSERT INTO Mouvement VALUES ('2006/01/12', 2, NULL);
    INSERT INTO Mouvement VALUES ('2006/01/13', 3, 2);
    INSERT INTO Mouvement VALUES ('2006/01/17', 7, 2);
    INSERT INTO Mouvement VALUES ('2006/01/15', 5, NULL);
    INSERT INTO Mouvement VALUES ('2006/01/25', 8, 5);
    COMMIT;
    La requête que je te propose :
    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
    SQL> SELECT Dat_Cre, Ide_Enr, Ide_Ref, '1' AS CodTri2, Ide_Enr AS CodTri1
      2  FROM Mouvement
      3  WHERE Ide_Ref IS NULL
      4  UNION
      5  SELECT Dat_Cre, Ide_Enr, Ide_Ref, '2' AS CodTri2, Ide_Ref AS CodTri1
      6  FROM Mouvement
      7  WHERE Ide_Ref IS NOT NULL
      8  ORDER BY CodTri1, CodTri2, Dat_Cre;
     
    DAT_CRE       IDE_ENR    IDE_REF C    CODTRI1
    ---------- ---------- ---------- - ----------
    2006/01/10          1            1          1
    2006/01/12          4          1 2          1
    2006/01/13          9          1 2          1
    2006/01/12          2            1          2
    2006/01/13          3          2 2          2
    2006/01/17          7          2 2          2
    2006/01/15          5            1          5
    2006/01/25          8          5 2          5
     
    8 ligne(s) sélectionnée(s).
    Par contre, je ne fais ni les sauts de lignes, ni de page ... ce n'est pas le boulot de SQL
      0  0

  8. #8
    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.
    Sous ORACLE Express( avec le jeu de données de Xo):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT M.Dat_Cre, M.Ide_Enr, M.Ide_Ref
      FROM Mouvement M
      ORDER BY NVL( M.Ide_Ref, M.Ide_Enr ), M.Dat_Cre
    ca donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DAT_CRE	IDE_ENR	IDE_REF
    2006/01/10	1	-
    2006/01/12	4	1
    2006/01/13	9	1
    2006/01/12	2	-
    2006/01/13	3	2
    2006/01/17	7	2
    2006/01/15	5	-
    2006/01/25	8	5
      0  0

  9. #9
    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 inoussa
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      ORDER BY NVL( M.Ide_Ref, M.Ide_Enr ), M.Dat_Cre
    Bien vu

    Et nettement plus élégant que ma solution ...
      0  0

  10. #10
    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 corrections et 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
      0  0

  11. #11
    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 duboisfa
    En effet, les champs Ide_Enr et Ide_Ref sont définis en varchar2.
    En quoi ça gêne ? Les solutions proposées, en particulier celles d'Inoussa, sont valides, on peut bien trier les valeurs alpha, non ? Quels résultats obtients-tu avec les requêtes proposées ?

    Suite à tes essais, s'il s'avère que j'ai tort :
    - explique-nous pourquoi, exemple à l'appui,
    - donne-nous les instructions SQL pour créer ton jeu d'essai, et faire nos tests dessus.
      0  0

  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
    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.
      0  0

  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
    Une petite précision encore, les mouvements initiaux peuvent être créés à la même date, soit le changement en gras suivant :

    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
      0  0

  14. #14
    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
    Pourquoi ne pas nous donner ton jeu d'essais directement en SQL ? Ca simplifierait le boulot de ceux qui veulent aider ...

    Donc le critère prépondérant du tri est la date de l'enregistrement d'en-tête, puis sa référence, puis la date du mouvement (origine ou associé) : il faut donc repartir sur la première idée qui consiste à séparer les 2 types d'enregistrements via un UNION, en faisant une jointure des mouvements associés vers les parents pour retrouver la date d'origine ... clair ?

    Je creuse, et je reviens
      0  0

  15. #15
    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
    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
    CREATE Table Mouvement (
    Dat_Cre VARCHAR2(10),
    Ide_Enr VARCHAR2(12),
    Ide_Ref VARCHAR2(12)); 
     
    INSERT INTO Mouvement VALUES ('2006/01/10', 'Mvt B', NULL); 
    INSERT INTO Mouvement VALUES ('2006/01/12', 'Mvt A', NULL);
    INSERT INTO Mouvement VALUES ('2006/01/12', 'An Mvt B4', 'Mvt B');
    INSERT INTO Mouvement VALUES ('2006/01/13', 'An Mvt A', 'Mvt A');
    INSERT INTO Mouvement VALUES ('2006/01/13', 'An 2 Mvt B9', 'Mvt B');
    INSERT INTO Mouvement VALUES ('2006/01/12', 'Mvt C', NULL);
    INSERT INTO Mouvement VALUES ('2006/01/17', 'An 2 Mvt A7', 'Mvt A');
    INSERT INTO Mouvement VALUES ('2006/01/25', 'An Mvt C', 'Mvt C');
     
    COMMIT;
    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
    SELECT Dat_Cre AS Dat_Ori, Dat_Cre AS Dat_Mvt, Ide_Enr, 
           Ide_Ref, '1' AS CodTri3, Ide_Enr AS CodTri2
      FROM Mouvement 
     WHERE Ide_Ref IS NULL
    UNION
    SELECT O.Dat_Cre AS Dat_Ori, A.Dat_Cre AS Dat_Mvt, A.Ide_Enr, 
           A.Ide_Ref, '2' AS CodTri3, A.Ide_Ref AS CodTri2
      FROM Mouvement O INNER JOIN Mouvement A ON O.Ide_Enr = A.Ide_Ref
     ORDER BY Dat_Ori, CodTri2, CodTri3;
     
    DAT_ORI    DAT_MVT    IDE_ENR      IDE_REF      C CODTRI2
    ---------- ---------- ------------ ------------ - ------------
    2006/01/10 2006/01/10 Mvt B                     1 Mvt B
    2006/01/10 2006/01/12 An Mvt B4    Mvt B        2 Mvt B
    2006/01/10 2006/01/13 An 2 Mvt B9  Mvt B        2 Mvt B
    2006/01/12 2006/01/12 Mvt A                     1 Mvt A
    2006/01/12 2006/01/13 An Mvt A     Mvt A        2 Mvt A
    2006/01/12 2006/01/17 An 2 Mvt A7  Mvt A        2 Mvt A
    2006/01/12 2006/01/12 Mvt C                     1 Mvt C
    2006/01/12 2006/01/25 An Mvt C     Mvt C        2 Mvt C
     
    8 ligne(s) sélectionnée(s).
    Et là, est-ce que ça le fait comme tu veux ?

    [Edit] verouillé pour multipost
    La suite sur le forum Oracle : http://www.developpez.net/forums/viewtopic.php?t=462327
    [/Edit]
      0  0

Discussions similaires

  1. 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
  2. Réponses: 21
    Dernier message: 17/06/2008, 10h54
  3. Ordre de sélection des lignes sur une table DB2
    Par Pierre Formosa dans le forum DB2
    Réponses: 1
    Dernier message: 26/04/2006, 20h03
  4. [SQL] Ordre d'affichage des lignes d'un état
    Par duboisfa dans le forum Oracle
    Réponses: 20
    Dernier message: 28/02/2006, 23h00
  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