Partage
  • Partager sur Facebook
  • Partager sur Twitter

SQL (ORACLE) Date de fin fictive

renseigner via sql une colonne "virtuelle" date de fin

    28 avril 2021 à 19:03:25

    Bonjour,

    J'ai une table MATABLE qui contient les infos suivante : CLE , DATEFF, SITUATION. Pas de DATFIN dans la table.

    J'ai donc besoin d'une requête qui me ramène la DATFIN (calculée par DATEFF - 1)

    CLE DATEFF DATFIN SITUATION
    000001 14/04/2014 30/07/2020 0
    000001 31/07/2020 08/03/2021 1
    000001 09/03/2021 null 0
    000002 15/08/2018 31/01/2020 0
    000002 01/02/2020 30/09/2020 1
    000002 01/09/2020 null 0

    Ma requête (qui ne marche pas sinon je ne serai pas là :D )

    select A.CLE, E.DATEFF
    , (select Y.dateff-1 from MATABLE Y where Y.dateff < E.dateff and Y.CLE= E.CLE) as datfin 
    ,E.SITUATION 
    from MATABLE E  ;

    Je sais que comme ça, ça ne peut pas marcher, car il faut au minimum un order by avant de récupérer la DATFIN... Et d'autre part, il faut à mon avis une boucle... que je ne sais pas faire... ou peut-être utiliser une table temporaire ? Ou les 2 ?? o_O

    Merci d'avance pour votre aide.
    • Partager sur Facebook
    • Partager sur Twitter
      29 avril 2021 à 9:22:22

      Bonjour,

      Je ne suis pas sûr de comprendre pourquoi tu crées un autre sujet ( cf. https://openclassrooms.com/forum/sujet/sql-oracle-date-de-debut-a-limiter ).

      Mais cela me donne l'opportunité de proposer une autre façon de voir les choses :

      SELECT
      	M1.CLE,
      	M1.DATEFF,
      	MAX( M2.DATEFF ) AS DATFIN,
      	M1.SITUATION
      FROM
      	MATABLE M1
      		LEFT JOIN MATABLE M2
      			ON M1.CLE = M2.CLE
      			AND M1.DATEFF > M2.DATEFF
      GROUP BY
      	M1.CLE,
      	M1.DATEFF,
      	M1.SITUATION
      ORDER BY
      	M1.CLE,
      	M1.DATEFF
      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        30 avril 2021 à 14:07:38

        Impeccable !! Merci.

        En effet, j'ai créé un sujet différent car la problématique de départ est différente. L'autre sujet consiste à délimiter les lignes sur une période donnée uniquement. Ici, c'est plus général : gérer les périodes sur une table sans date de fin.

        Ta requête-ci fonctionne très bien, à un petit détail près : les date de fin ne sont pas cohérentes :

        EDIT : l'image collée ne fonctionne pas manifestement... 

        SELECT
            M1.NUDOSS,
            M1.DATEFF,
            MAX( M2.DATEFF ) AS DATFIN,
            M1.EXPATR
        FROM
            HR.ZYE5 M1
                LEFT JOIN HR.ZYE5 M2
                    ON M1.NUDOSS = M2.NUDOSS
                    AND M1.DATEFF > M2.DATEFF

        where M1.nudoss = (select nudoss from hr.zy00 where matcle = '0332541')

        GROUP BY M1.NUDOSS, M1.DATEFF, M1.EXPATR
        ORDER BY
            M1.NUDOSS,
            M1.DATEFF DESC

        ;

        NUDOSS DATEFF DATFIN EXPATR
        198571 09/03/2021 31/07/2020 0
        198571 31/07/2020 14/04/2014 1
        198571 14/04/2014   0

        On devrait avoir :

        • 09/03/2021 - NULL --> situation en cours donc pas de date de fin
        • 31/07/2020 - 09/03/2021 (- 1 jour mais peu importe ici)
        • 14/04/2014 - 31/07/2020 (- 1 jour mais peu importe ici)

        voilà voila ;)

        Merci infiniment pour ton aide.

        -
        Edité par RazMockt 30 avril 2021 à 14:11:29

        • Partager sur Facebook
        • Partager sur Twitter
          30 avril 2021 à 14:10:05

          La copie d'écran n'est pas passée ...

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            30 avril 2021 à 15:42:19

            Benzouye a écrit:

            La copie d'écran n'est pas passée ...


            non. C'est pour ça que j'ai fait un copier coller directement à la place (requête en vert et résultat en tableau).
            • Partager sur Facebook
            • Partager sur Twitter
              30 avril 2021 à 17:26:42

              Ma requête est inversée en fait, il faut faire le contraire, trouver le mini dans les situations postérieures, et au passage y retirer un jour :

              SELECT
              	M1.NUDOSS,
              	M1.DATEFF,
              	MIN( M2.DATEFF ) - 1 AS DATFIN,
              	M1.EXPATR
              FROM
              	HR.ZYE5 M1
              		LEFT JOIN MATABLE M2
              			ON M1.NUDOSS = M2.NUDOSS
              			AND M1.DATEFF < M2.DATEFF
              GROUP BY
              	M1.NUDOSS,
              	M1.DATEFF,
              	M1.EXPATR
              ORDER BY
              	M1.NUDOSS,
              	M1.DATEFF DESC

              ça le fait ?

              -
              Edité par Benzouye 30 avril 2021 à 17:28:58

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                27 mai 2021 à 19:30:08

                Hello,

                Cette fois-ci c'est ok.

                J'a rajouté une restriction nécessaire et qui devait surement être mon pb depuis le début !!!

                Affaire réglée donc.

                Merci infiniment pour votre aide :ange:

                SELECT
                    M1.NUDOSS,
                    M1.DATEFF,
                    MIN( M2.DATEFF ) - 1 AS DATFIN,
                    M1.EXPATR
                FROM
                    HR.ZYE5 M1
                        LEFT JOIN HR.ZYE5 M2
                            ON M1.NUDOSS = M2.NUDOSS
                            AND M1.DATEFF < M2.DATEFF and M1.TYPPAR = 'SP'
                where M1.nudoss = 215655
                and M2.TYPPAR = 'SP'
                GROUP BY
                    M1.NUDOSS,
                    M1.DATEFF,
                    M1.EXPATR
                ORDER BY
                    M1.NUDOSS,
                    M1.DATEFF DESC

                  ;


                reste toutefois une petite bricole : la dernière DATEFF n'est pas ramenée.

                Données brutes :

                NUDOSS TYPPAR EXPATR DATEFF
                215655 SP 1 05/08/2020
                215655 SP 0 01/07/2020
                215655 SP 1 19/08/2018
                215655 SP 0 01/09/2014


                Résultat requête : Il manque la ligne du 05/08/20 qui est celle en vigueur (et qui n'a donc pas de date de fin...)

                NUDOSS DATEFF DATFIN EXPATR
                215655 01/07/2020 04/08/2020 0
                215655 19/08/2018 30/06/2020 1
                215655 01/09/2014 18/08/2018 0

                -
                Edité par RazMockt 27 mai 2021 à 19:46:28

                • Partager sur Facebook
                • Partager sur Twitter
                  28 mai 2021 à 9:10:39

                  Lorsque l'on utilise des jointures externes (ici LEFT JOIN), utiliser la table de cette jointure dans la clause WHERE "casse" la jointure externe et la fait fonctionner comme une jointure interne.

                  Il faut donc, je suppose, inverser les conditions sur TYPARR :

                  SELECT
                  	M1.NUDOSS,
                  	M1.DATEFF,
                  	MIN( M2.DATEFF ) - 1 AS DATFIN,
                  	M1.EXPATR
                  FROM
                  	HR.ZYE5 M1
                  		LEFT JOIN HR.ZYE5 M2
                  			ON M1.NUDOSS = M2.NUDOSS
                  			AND M1.DATEFF < M2.DATEFF
                  			AND M2.TYPPAR = 'SP'
                  WHERE
                  	M1.NUDOSS = 215655
                  	AND M1.TYPPAR = 'SP'
                  GROUP BY
                  	M1.NUDOSS,
                  	M1.DATEFF,
                  	M1.EXPATR
                  ORDER BY
                  	M1.NUDOSS,
                  	M1.DATEFF DESC

                  J'ai juste inversé les lignes 11 et 14.

                  -
                  Edité par Benzouye 28 mai 2021 à 9:11:09

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

                  SQL (ORACLE) Date de fin fictive

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown