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

SQL Oracle Discussion :

Comment écrire cette requête ?


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 32
    Points : 23
    Points
    23
    Par défaut Comment écrire cette requête ?
    Bonjour,

    J'ai une table qui contient les quatre colonnes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Activité           Date_debut                        Date_fin                  Priorité
    Natation          2012/10/24 08:10:00           2012/10/24 10:10:00             2
    Judo              2012/10/24 11:00:00           2012/10/24 12:00:00             1
    Lecture           2012/10/24 14:10:00           2012/10/24 17:10:00             3
    Jogging           2012/10/24 17:30:00           2012/10/24 18:30:00             4
     
    Natation          2012/10/25 08:10:00           2012/10/25 10:10:00             2
    Jogging           2012/10/25 17:30:00           2012/10/25 18:30:00             4
    Je cherche à obtenir ceci : classer par date, les activités par ordre de priorité. A cela, s'ajoute, la durée par activité, le tout séparé par des ";".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Date                   Actvité_priorité_durée_en_heure
    2012/10/24            Judo;1;Natation;2;Lecture;3;Jogging;1
    2012/10/25            Judo;0;Natation;2;Lecture;0;Jogging;1
    Avez-vous une idée ?
    Merci d'avance pour votre aide.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    pas directement !

    il vaut mieux passé par le programme qui pilote la base (PHP, C++, etc)
    Merci d'ajouter un sur les tags qui vous ont aidé

  3. #3
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    sous quel SGBD travailles tu?
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 32
    Points : 23
    Points
    23
    Par défaut
    Merci pour vos réponses.

    Je suis sous Oracle 10.
    J'ai pensé utiliser l'ETL d'Oracle (ODI) pour résoudre ce problème mais j'avoue que ce n'est pas simple.

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    Citation Envoyé par dehorter olivier Voir le message
    pas directement !

    il vaut mieux passé par le programme qui pilote la base (PHP, C++, etc)
    ou d'utiliser les procédures stockées
    Merci d'ajouter un sur les tags qui vous ont aidé

  6. #6
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    Si tu n's pas assez de priorités, je te propose une solution avec un jeu de doneées comportant 4 priorités.
    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
    32
    33
    34
    35
    with tab as
    (                                                
    select 'Natation' Activité,          to_date('2012/10/24 08:10:00','yyyy/mm/dd hh24:mi:ss') Date_debut            ,'2012/10/24 10:10:00'  Date_fin,             2 Priorité from dual union
    select 'Judo'             , to_date('2012/10/24 11:00:00','yyyy/mm/dd hh24:mi:ss')           ,'2012/10/24 12:00:00',             1 from dual union
    select 'Lecture'          ,to_date( '2012/10/24 14:10:00','yyyy/mm/dd hh24:mi:ss')           ,'2012/10/24 17:10:00',             3 from dual union
    select 'Jogging'          , to_date('2012/10/24 17:30:00','yyyy/mm/dd hh24:mi:ss')          ,'2012/10/24 18:30:00',             4 from dual union
    select 'Natation'         ,to_date('2012/10/25 08:10:00','yyyy/mm/dd hh24:mi:ss')           ,'2012/10/25 08:10:00',             2 from dual union
    select 'Jogging'          , to_date('2012/10/25 17:30:00','yyyy/mm/dd hh24:mi:ss')           ,'2012/10/25 17:30:00',             4 from dual union
    select 'Natation'         ,to_date('2012/10/26 08:10:00','yyyy/mm/dd hh24:mi:ss')             ,'2012/10/24 10:10:00'  ,             4 from dual union
    select 'Judo'             , to_date('2012/10/26 11:00:00','yyyy/mm/dd hh24:mi:ss')           ,'2012/10/26 12:00:00',             2 from dual union
    select 'Lecture'          ,to_date( '2012/10/26 14:10:00','yyyy/mm/dd hh24:mi:ss')           ,'2012/10/26 17:10:00',             1 from dual union
    select 'Jogging'          , to_date('2012/10/26 17:30:00','yyyy/mm/dd hh24:mi:ss')          ,'2012/10/26 18:30:00',             3 from dual 
     
    )
     
     
     
    select XX.date_debut,XX.ordre from 
     
    (select trunc(A.date_debut)date_debut,
    (A.Activité||';'||A.Priorité||';'||B.Activité||';'||B.Priorité||';'||C.Activité||';'||C.Priorité||';'||D.Activité||';'||D.Priorité) ordre,length(A.Activité||';'||A.Priorité||';'||B.Activité||';'||B.Priorité||';'||C.Activité||';'||C.Priorité||';'||D.Activité||';'||D.Priorité)taille
    from ((tab A left join tab B on trunc(A.date_debut)=trunc(B.date_debut) and A.Priorité<B.Priorité)
    left join tab C on trunc(B.date_debut)=trunc(C.date_debut)and B.Priorité<C.Priorité)
    left join tab D on trunc(C.date_debut)=trunc(D.date_debut)and C.Priorité<D.Priorité
    group by trunc(A.date_debut),(A.Activité||';'||A.Priorité||';'||B.Activité||';'||B.Priorité||';'||C.Activité||';'||C.Priorité||';'||D.Activité||';'||D.Priorité),length(A.Activité||';'||A.Priorité||';'||B.Activité||';'||B.Priorité||';'||C.Activité||';'||C.Priorité||';'||D.Activité||';'||D.Priorité)
    )XX
     
    join
     
    (select trunc(A.date_debut) date_debut,max(length(A.Activité||';'||A.Priorité||';'||B.Activité||';'||B.Priorité||';'||C.Activité||';'||C.Priorité||';'||D.Activité||';'||D.Priorité))taille
    from ((tab A left join tab B on trunc(A.date_debut)=trunc(B.date_debut) and A.Priorité<B.Priorité)
    left join tab C on trunc(B.date_debut)=trunc(C.date_debut)and B.Priorité<C.Priorité)
    left join tab D on trunc(C.date_debut)=trunc(D.date_debut)and C.Priorité<D.Priorité
    group by trunc(A.date_debut)
    )YY on XX.date_debut=YY.date_debut and XX.taille=YY.taille
    bonne chance
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Je l'ai fait ainsi :
    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
    WITH MaTable AS
    (                                                
    SELECT 'Natation' as Activite, to_date('2012/10/24 08:10','yyyy/mm/dd hh24:mi') as Date_debut, to_date('2012/10/24 10:10','yyyy/mm/dd hh24:mi') as Date_fin, 2 as Priorite FROM dual union all
    SELECT 'Judo'                , to_date('2012/10/24 11:00','yyyy/mm/dd hh24:mi')              , to_date('2012/10/24 12:00','yyyy/mm/dd hh24:mi')            , 1             FROM dual union all
    SELECT 'Lecture'             , to_date('2012/10/24 14:10','yyyy/mm/dd hh24:mi')              , to_date('2012/10/24 17:10','yyyy/mm/dd hh24:mi')            , 3             FROM dual union all
    SELECT 'Jogging'             , to_date('2012/10/24 17:30','yyyy/mm/dd hh24:mi')              , to_date('2012/10/24 18:30','yyyy/mm/dd hh24:mi')            , 4             FROM dual union all
    SELECT 'Natation'            , to_date('2012/10/25 08:10','yyyy/mm/dd hh24:mi')              , to_date('2012/10/25 10:10','yyyy/mm/dd hh24:mi')            , 2             FROM dual union all
    SELECT 'Jogging'             , to_date('2012/10/25 17:30','yyyy/mm/dd hh24:mi')              , to_date('2012/10/25 18:30','yyyy/mm/dd hh24:mi')            , 4             FROM dual
    )
      ,  Tab_deb as
    (
    select distinct trunc(Date_debut) as dt_deb from MaTable
    )
        select td.dt_deb as "Date"
             , rtrim(REPLACE(REPLACE(XMLAgg(XMLElement("x", mt.Activite || ';' || coalesce(to_char((mt.Date_fin - mt.Date_debut)*24, 'fm90'), '0')) order by mt.Priorite asc), '<x>', ''), '</x>', ';'), ';') as "Actvité_Durée"
          from MaTable mt partition by (mt.Activite, mt.Priorite)
    right join Tab_deb td
            on td.dt_deb = trunc(mt.Date_debut)
      group by td.dt_deb
      order by td.dt_deb asc;
     
    Date       Actvité_Durée
    ---------- -------------------------------------
    2012/10/24 Judo;1;Natation;2;Lecture;3;Jogging;1
    2012/10/25 Judo;0;Natation;2;Lecture;0;Jogging;1

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 32
    Points : 23
    Points
    23
    Par défaut
    Merci pour vos réponses.
    Je vais essayer de comprendre le code et le mettre en œuvre.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 32
    Points : 23
    Points
    23
    Par défaut
    Suite..j'ai essayé de lancer la requête et je tombe sur l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-19011 : Character string buffer too small
    J'ai mené mes recherches sur le net et sur ce site, à priori, il faut activer une fonction .

    Pour précision, j'ai 20 priorités dans mon cas. Est-ce que ce message d'erreur vient de là ?

    Après analyse et tests, je pense qu'il manque un élément clé à mon cas : les activités que j'ai mentionnées sont rattachés à une personne. En gros, les activités sont à multiplier par n personnes. Ces personnes sont identifiées par un id technique. Je pense que l'erreur renvoyée par Oracle vient de là.

    Qu'en pensez-vous ?

  10. #10
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Difficile à dire comme ça, le mieux serait un cas réel (qui plante) avec quelques données - sous forme "with" c'est pas mal, create table et insert conviennent également.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 32
    Points : 23
    Points
    23
    Par défaut
    Voici un cas concret :

    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
    WITH MaTable AS
    (                  
    SELECT 'Natation' AS Activite, to_date('2012/10/24 08:10','yyyy/mm/dd hh24:mi') AS Date_debut, to_date('2012/10/24 10:10','yyyy/mm/dd hh24:mi') AS Date_fin, 2 AS Priorite, 102030 num_sportif  	FROM dual union ALL
    SELECT 'Judo'                , to_date('2012/10/24 11:00','yyyy/mm/dd hh24:mi')              , to_date('2012/10/24 12:00','yyyy/mm/dd hh24:mi')            , 1            , 102030  				      FROM dual union ALL
    SELECT 'Lecture'             , to_date('2012/10/24 14:10','yyyy/mm/dd hh24:mi')              , to_date('2012/10/24 17:10','yyyy/mm/dd hh24:mi')            , 3            , 102030  				      FROM dual union ALL
    SELECT 'Jogging'             , to_date('2012/10/24 17:30','yyyy/mm/dd hh24:mi')              , to_date('2012/10/24 18:30','yyyy/mm/dd hh24:mi')            , 4            , 102030  				      FROM dual union ALL
    SELECT 'Natation'            , to_date('2012/10/25 08:10','yyyy/mm/dd hh24:mi')              , to_date('2012/10/25 10:10','yyyy/mm/dd hh24:mi')            , 2            , 102030  				      FROM dual union ALL
    SELECT 'Jogging'             , to_date('2012/10/25 17:30','yyyy/mm/dd hh24:mi')              , to_date('2012/10/25 18:30','yyyy/mm/dd hh24:mi')            , 4            , 102030  				      FROM dual union ALL
    SELECT 'Natation'            , to_date('2012/10/24 10:10','yyyy/mm/dd hh24:mi')              , to_date('2012/10/24 12:10','yyyy/mm/dd hh24:mi')            , 2            , 102031   	            FROM dual union ALL
    SELECT 'Judo'                , to_date('2012/10/24 11:00','yyyy/mm/dd hh24:mi')              , to_date('2012/10/24 13:00','yyyy/mm/dd hh24:mi')            , 1            , 102031  				      FROM dual union ALL
    SELECT 'Lecture'             , to_date('2012/10/24 15:10','yyyy/mm/dd hh24:mi')              , to_date('2012/10/24 17:10','yyyy/mm/dd hh24:mi')            , 3            , 102031  				      FROM dual union ALL
    SELECT 'Jogging'             , to_date('2012/10/24 17:30','yyyy/mm/dd hh24:mi')              , to_date('2012/10/24 18:30','yyyy/mm/dd hh24:mi')            , 4            , 102031  				      FROM dual union ALL
    SELECT 'Natation'            , to_date('2012/10/25 08:10','yyyy/mm/dd hh24:mi')              , to_date('2012/10/25 10:10','yyyy/mm/dd hh24:mi')            , 2            , 102031  				      FROM dual union ALL
    SELECT 'Jogging'             , to_date('2012/10/25 17:30','yyyy/mm/dd hh24:mi')              , to_date('2012/10/25 18:30','yyyy/mm/dd hh24:mi')            , 4            , 102031  				      FROM dual
    )
    Un peu comme dans le même style que la première question, je cherche à obtenir le résultat suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Date       num_sportif_Actvité_Durée
    ---------- -------------------------------------
    2012/10/24 102030;Judo;1;Natation;2;Lecture;3;Jogging;1
    2012/10/24 102031;Judo;2;Natation;2;Lecture;2;Jogging;1
    2012/10/25 102030;Judo;0;Natation;2;Lecture;0;Jogging;1
    2012/10/25 102031;Judo;0;Natation;2;Lecture;0;Jogging;1

  12. #12
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Il suffit d'adapter un peu la requête pour ajouter le num_sportif, et pour l'erreur ORA-19011, si la chaîne concaténée est trop longue il faut convertir en clob :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        SELECT td.dt_deb AS "Date"
             , mt.num_sportif ||';' || rtrim(REPLACE(REPLACE(XMLTYPE.getClobVal(XMLAgg(XMLElement("x", mt.Activite || ';' || coalesce(to_char((mt.Date_fin - mt.Date_debut)*24, 'fm90'), '0')) ORDER BY mt.Priorite ASC)), '<x>', ''), '</x>', ';'), ';') AS "num_sportif_Actvité_Durée"
          FROM MaTable mt partition BY (mt.num_sportif, mt.Activite, mt.Priorite)
    RIGHT JOIN Tab_deb td
            ON td.dt_deb = trunc(mt.Date_debut)
      GROUP BY td.dt_deb, mt.num_sportif
      ORDER BY td.dt_deb ASC;

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 32
    Points : 23
    Points
    23
    Par défaut
    Merci infiniment et bravo pour la performance.

    Je compte rendre un peu plus complexe le besoin avec la notion de chevauchement entre activité. Je m'explique :
    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
     
    WITH MaTable AS
    (                  
    SELECT 'Natation' AS Activite, to_date('2012/10/24 08:10','yyyy/mm/dd hh24:mi') AS Date_debut, to_date('2012/10/24 10:10','yyyy/mm/dd hh24:mi') AS Date_fin, 2 AS Priorite, 102030 num_sportif  	FROM dual union ALL
    SELECT 'Judo'                , to_date('2012/10/24 11:11','yyyy/mm/dd hh24:mi')              , to_date('2012/10/24 12:00','yyyy/mm/dd hh24:mi')            , 1            , 102030  				      FROM dual union ALL
    SELECT 'Lecture'             , to_date('2012/10/24 09:00','yyyy/mm/dd hh24:mi')              , to_date('2012/10/24 11:10','yyyy/mm/dd hh24:mi')            , 3            , 102030  				      FROM dual union ALL
    SELECT 'Jogging'             , to_date('2012/10/24 17:30','yyyy/mm/dd hh24:mi')              , to_date('2012/10/24 18:30','yyyy/mm/dd hh24:mi')            , 4            , 102030  				      FROM dual union ALL
    SELECT 'Natation'            , to_date('2012/10/25 08:10','yyyy/mm/dd hh24:mi')              , to_date('2012/10/25 10:10','yyyy/mm/dd hh24:mi')            , 2            , 102030  				      FROM dual union ALL
    SELECT 'Jogging'             , to_date('2012/10/25 17:30','yyyy/mm/dd hh24:mi')              , to_date('2012/10/25 18:30','yyyy/mm/dd hh24:mi')            , 4            , 102030  				      FROM dual union ALL
    SELECT 'Natation'            , to_date('2012/10/24 10:10','yyyy/mm/dd hh24:mi')              , to_date('2012/10/24 12:10','yyyy/mm/dd hh24:mi')            , 2            , 102031   	            FROM dual union ALL
    SELECT 'Judo'                , to_date('2012/10/24 11:00','yyyy/mm/dd hh24:mi')              , to_date('2012/10/24 13:00','yyyy/mm/dd hh24:mi')            , 1            , 102031  				      FROM dual union ALL
    SELECT 'Lecture'             , to_date('2012/10/24 15:10','yyyy/mm/dd hh24:mi')              , to_date('2012/10/24 17:10','yyyy/mm/dd hh24:mi')            , 3            , 102031  				      FROM dual union ALL
    SELECT 'Jogging'             , to_date('2012/10/24 17:30','yyyy/mm/dd hh24:mi')              , to_date('2012/10/24 18:30','yyyy/mm/dd hh24:mi')            , 4            , 102031  				      FROM dual union ALL
    SELECT 'Natation'            , to_date('2012/10/25 08:10','yyyy/mm/dd hh24:mi')              , to_date('2012/10/25 10:10','yyyy/mm/dd hh24:mi')            , 2            , 102031  				      FROM dual union ALL
    SELECT 'Jogging'             , to_date('2012/10/25 17:30','yyyy/mm/dd hh24:mi')              , to_date('2012/10/25 18:30','yyyy/mm/dd hh24:mi')            , 4            , 102031  				      FROM dual
    )
    Concentrons-nous sur les deux lignes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    WITH MaTable AS
    (                  
    SELECT 'Natation' AS Activite, to_date('2012/10/24 08:10','yyyy/mm/dd hh24:mi') AS Date_debut, to_date('2012/10/24 10:10','yyyy/mm/dd hh24:mi') AS Date_fin, 2 AS Priorite, 102030 num_sportif  	FROM dual union ALL
    SELECT 'Lecture'             , to_date('2012/10/24 09:00','yyyy/mm/dd hh24:mi')              , to_date('2012/10/24 11:10','yyyy/mm/dd hh24:mi')            , 3            , 102030  				      FROM dual union ALL
    La première ligne est de priorité 2 et la 2ème est de priorité 3. Seulement voilà, notre sportif en herbe a mal saisi son timing. Ce que je souhaite faire est ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    WITH MaTable AS
    (                  
    SELECT 'Natation' AS Activite, to_date('2012/10/24 08:10','yyyy/mm/dd hh24:mi') AS Date_debut, to_date('2012/10/24 10:10','yyyy/mm/dd hh24:mi') AS Date_fin, 2 AS Priorite, 102030 num_sportif  	FROM dual union ALL
    SELECT 'Lecture'             , to_date('2012/10/24 10:11','yyyy/mm/dd hh24:mi')              , to_date('2012/10/24 11:10','yyyy/mm/dd hh24:mi')            , 3            , 102030  				      FROM dual union ALL
    Autrement dit, étant donné que la première ligne et la 2ème se chevauchent. Je souhaite par conséquent, en fonction des priorités, couper les morceaux qui se chevauchent. Dans notre cas :

    La ligne 1 de priorité 2 se termine à 10:10, donc, la ligne 2 de priorité 3 ne doit pas démarrer avant 10:10. C'est la raison pour laquelle, son heure de début à changer en le mettant à 10:11.

    Je sais que ce n'est pas simple, mais dans le même temps, vous êtes tellement forts sur ce forum que j'ai espoir de résoudre mon pb.

    Merci à vous.

  14. #14
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Utilise lead/lag pour transformer les dates de la tables avant de les concaténer :
    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 AS
    (                  
    SELECT 'Natation' AS Activite, to_date('2012/10/24 08:10','yyyy/mm/dd hh24:mi') AS Date_debut, to_date('2012/10/24 10:10','yyyy/mm/dd hh24:mi') AS Date_fin, 2 AS Priorite, 102030 num_sportif  	FROM dual union ALL
    SELECT 'Judo'                , to_date('2012/10/24 11:11','yyyy/mm/dd hh24:mi')              , to_date('2012/10/24 12:00','yyyy/mm/dd hh24:mi')            , 1            , 102030  				      FROM dual union ALL
    SELECT 'Lecture'             , to_date('2012/10/24 09:00','yyyy/mm/dd hh24:mi')              , to_date('2012/10/24 11:10','yyyy/mm/dd hh24:mi')            , 3            , 102030  				      FROM dual union ALL
    SELECT 'Jogging'             , to_date('2012/10/24 17:30','yyyy/mm/dd hh24:mi')              , to_date('2012/10/24 18:30','yyyy/mm/dd hh24:mi')            , 4            , 102030  				      FROM dual union ALL
    SELECT 'Natation'            , to_date('2012/10/25 08:10','yyyy/mm/dd hh24:mi')              , to_date('2012/10/25 10:10','yyyy/mm/dd hh24:mi')            , 2            , 102030  				      FROM dual union ALL
    SELECT 'Jogging'             , to_date('2012/10/25 17:30','yyyy/mm/dd hh24:mi')              , to_date('2012/10/25 18:30','yyyy/mm/dd hh24:mi')            , 4            , 102030  				      FROM dual union ALL
    SELECT 'Natation'            , to_date('2012/10/24 10:10','yyyy/mm/dd hh24:mi')              , to_date('2012/10/24 12:10','yyyy/mm/dd hh24:mi')            , 2            , 102031   	            FROM dual union ALL
    SELECT 'Judo'                , to_date('2012/10/24 11:00','yyyy/mm/dd hh24:mi')              , to_date('2012/10/24 13:00','yyyy/mm/dd hh24:mi')            , 1            , 102031  				      FROM dual union ALL
    SELECT 'Lecture'             , to_date('2012/10/24 15:10','yyyy/mm/dd hh24:mi')              , to_date('2012/10/24 17:10','yyyy/mm/dd hh24:mi')            , 3            , 102031  				      FROM dual union ALL
    SELECT 'Jogging'             , to_date('2012/10/24 17:30','yyyy/mm/dd hh24:mi')              , to_date('2012/10/24 18:30','yyyy/mm/dd hh24:mi')            , 4            , 102031  				      FROM dual union ALL
    SELECT 'Natation'            , to_date('2012/10/25 08:10','yyyy/mm/dd hh24:mi')              , to_date('2012/10/25 10:10','yyyy/mm/dd hh24:mi')            , 2            , 102031  				      FROM dual union ALL
    SELECT 'Jogging'             , to_date('2012/10/25 17:30','yyyy/mm/dd hh24:mi')              , to_date('2012/10/25 18:30','yyyy/mm/dd hh24:mi')            , 4            , 102031  				      FROM dual
    )
      ,  Tab_deb AS
    (
    SELECT DISTINCT trunc(Date_debut) AS dt_deb FROM MaTable
    )
      ,  Tab_maj AS
    (
    SELECT t.Activite,
           case when t.Priorite   > lag(t.Priorite) over (partition by t.num_sportif order by t.Date_debut)
                 and t.Date_debut < lag(t.Date_fin) over (partition by t.num_sportif order by t.Date_debut)                       
                then lag(t.Date_fin) over (partition by t.num_sportif order by t.Date_debut)+1/24/60
                else t.Date_debut
            end as Date_debut,
           t.date_fin, t.Priorite, t.num_sportif
      from matable t
    )
    select * from tab_maj

  15. #15
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Une petite remarque sur le passage en CLOB, GetClobVal est une méthode qui s'applique à beaucoup de fonctions XML, dont XMLAgg.

    On peut donc simplifier l'expression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XMLTYPE.getClobVal(XMLAgg(...))
    En :

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 32
    Points : 23
    Points
    23
    Par défaut
    Merci infiniment pour votre aide.
    La requête m'a permis d'identifier des cas très tordus , le voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    WITH MaTable AS
    (                  
    SELECT 'Jogging' AS Activite	, to_date('2012/10/24 09:00','yyyy/mm/dd hh24:mi') AS Date_debut	, to_date('2012/10/26 13:00','yyyy/mm/dd hh24:mi') AS Date_fin, 4 AS Priorite, 102030 num_sportif  		  FROM dual union ALL
    SELECT 'Jogging'             	, to_date('2012/10/24 14:00','yyyy/mm/dd hh24:mi')              	, to_date('2012/10/24 16:00','yyyy/mm/dd hh24:mi')            , 4            , 102030  				      FROM dual union ALL
    SELECT 'Jogging'             	, to_date('2012/10/24 16:01','yyyy/mm/dd hh24:mi')              	, to_date('2012/10/24 17:00','yyyy/mm/dd hh24:mi')            , 4            , 102030  				      FROM dual union ALL
    SELECT 'Lecture'             	, to_date('2012/10/24 17:01','yyyy/mm/dd hh24:mi')              	, to_date('2012/10/24 18:00','yyyy/mm/dd hh24:mi')            , 3            , 102030  				      FROM dual
    )
    Voyez-vous, ce gus est un petit futé. Il m'annonce qu'il a fait du jogging pendant 2 jours sans interruption. Dans le même temps, il a découpé la journée du 24 en deux activités distinctes.
    Bref, dans mon select, je souhaite récupérer uniquement la première ligne parce que toutes les autres sont implicitement incluses dans celle-ci. La priorité 4 étant la plus élevée arrange les choses. La dernière ligne va disparaitre parce que sa priorité est moins élevée.
    J'espère que ça sera mon dernier cas à vous soumettre.
    Quoi qu'il en soit, merci pour votre précieuse aide

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

Discussions similaires

  1. [AC-2003] comment écrire cette requête sous sql?
    Par NANOUSUN dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 27/10/2009, 21h13
  2. Comment formuler cette requête
    Par hudony dans le forum Requêtes
    Réponses: 2
    Dernier message: 13/02/2009, 22h12
  3. Réponses: 1
    Dernier message: 26/08/2008, 14h26
  4. Comment faire cette requête ?
    Par Cazaux-Moutou-Philippe dans le forum Bases de données
    Réponses: 11
    Dernier message: 02/11/2007, 08h44
  5. [MFC] comment écrire des requêtes SQL
    Par kitsune dans le forum MFC
    Réponses: 9
    Dernier message: 27/09/2005, 15h23

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