Partage
  • Partager sur Facebook
  • Partager sur Twitter

SQL (ORACLE) DATE DE DEBUT A LIMITER

Situation en cours + précédente, sans date de fin dans la matable

    28 février 2021 à 20:05:28

    Bonjour,

    J'ai une table avec les infos suivantes :

    ----------DEBUT TABLEAU----------

    CLE  ||  DEBUT        ||  SITUATION          --> RAMENER OUI/NON

    001  || 01//02/2020  ||   MARIE (ligne A)     --> OUI

    001  || 12//04/2019  ||   CONCUB (ligne B)  --> OUI

    001  || 25//08/2018  ||   CELIB (ligne C)      --> NON

    002  || 01//05/2020  ||   CONCUB (ligne D)  --> OUI

    002  || 15//12/2019  ||   CELIB (ligne E)      --> OUI

    003  || 02//01/2021  ||   DIVORCE (ligne E) --> NON

    003  || 13//08/2020  ||   MARIE (ligne E)     --> OUI

    ----------FIN TABLEAU----------

    L'objectif est de ramener en résultat uniquement les lignes qui ont du 2020 (ça c'est ok je sais faire)

    Mais aussi uniquement la ligne précédente si la première ligne ramenée contient du 2020. Je ne veux pas de tout l'historique...

    Et là je bloque... A-t-on besoin d'une boucle PL-SQL ?? Parce que mes connaissances SQL sont assez élevées, mais par sur de la prog -PL-SQL o_O

    Je sais faire part exemple avec "DATE DEBUT" et "DATE DE FIN", genre "and ( X.DATEFFET >= '01/01/2020' or X.DATFIN >= '01/01/2020' )" 

    mais pas trouvé pour "DATE DEBUT" uniquement ?? Je me casse le nez depuis au moins ... (J'ose pas le dire !!! :D)

    Requête de base 

    select CLE, DEBUT, SITUATION

     

    from MATABLE

     

    WHERE DEBUT = (select max(DEBUT) from MATABLE Y where Y.CLE = MATABLE.CLE)

     

    order by  CLE, DEBUT, SITUATION

    ;

    Je vous remercie d'avance pour votre aide précieuse...

    • Partager sur Facebook
    • Partager sur Twitter
      1 mars 2021 à 9:55:15

      Bonjour,

      Je pense que tu peux t'en sortir avec une requête "simple".

      Une sous-requête avec une auto jointure pour identifier la situation précédente et une requête principale qui fait le lien.

      Exemple :

      SELECT
      	T1.CLE,
      	T1.DEBUT,
      	T1.SITUATION,
      	T2.DEBUT AS DEBUT_PRECEDENTE,
      	T2.SITUATION AS SITUATION_PRECEDENTE
      FROM
      	(
      		-- Début situation précédente par clé
      		SELECT
      			T1.CLE,
      			T1.DEBUT,
      			MAX( T2.DEBUT ) AS DEBUT_PRECEDENT
      		FROM
      			MATABLE T1
      				LEFT JOIN MATABLE T2
      					ON T1.CLE = T2.CLE
      					AND T1.DEBUT > T2.DEBUT
      		GROUP BY T1.CLE, T1.DEBUT
      	) AS P
      		
      		INNER JOIN MATABLE T1
      			ON P.CLE = T1.CLE
      			AND P.DEBUT = T1.DEBUT
      		
      		LEFT JOIN MATABLE T2
      			ON P.CLE = T2.CLE
      			AND P.DEBUT_PRECEDENT = T2.DEBUT
      ORDER BY
      	T1.CLE,
      	T1.DEBUT
      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        1 mars 2021 à 12:22:20

        Bonjour,

        Merci Benzouye. Je vais tenter effectivement la jointure.

        Mais du coup, si j'ai 2 dates sur l'année 2020, je dois rajouter une 3ème jointure je pense, non ?

        CLE  ||  DEBUT        ||  SITUATION          --> RAMENER OUI/NON

        004  || 01//06/2020  ||   MARIE (ligne A)      --> OUI

        004  || 12//04/2020  ||   CONCUB (ligne B)     --> OUI

        004  || 25//08/2018  ||   CELIB (ligne C)      --> OUI

        004  || 25//08/2017  ||   CELIB (ligne D)      --> NON

        Et si j'ai plusieurs dates de 2020, il va falloir passer par une boucle :( ? Que je ne sais pas faire...

        Merci d'avance pour vos réponses.

        • Partager sur Facebook
        • Partager sur Twitter
          1 mars 2021 à 12:30:23

          Avec les données d'exemple, ma requête va retourner :

          CLEDEBUTSITUATIONDEBUT_PRECEDENTESITUATION_PRECEDENTE
          004 25/08/2017 CELIB NULL NULL
          004 25/08/2018 CELIB 25/08/2017 CELIB
          004 12/04/2020 CONCUB 25/08/2018 CELIB
          004 01/06/2020 MARIE 12/04/2020 CONCUB

          A toi de filtrer selon ce que tu souhaites ...

          Que voudrais-tu comme résultat ici ?

          -
          Edité par Benzouye 1 mars 2021 à 12:30:42

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            2 mars 2021 à 18:28:45

            Hello, merci pour ton retour.

            Ah oui la restriction c'est sur l'année. Donc je veux : "2020 + LA ligne précédente < à 2020". Donc dans l'exemple c'est les 3 dernières lignes, mais pas la première de 2017 qui ne m'intéresse pas. C'est surtout ça qu'il faut arriver à faire. Il faut empêcher de récupérer ce qui est "avant l'occurrence < à 2020" (donc empêcher celle de 2017 d'être envoyée en résultat)...C'est là que je coince...

            004 25/08/2018 CELIB 25/08/2017 CELIB
            004 12/04/2020 CONCUB 25/08/2018 CELIB
            004 01/06/2020 MARIE 12/04/2020 CONCUB

            -
            Edité par RazMockt 2 mars 2021 à 18:38:44

            • Partager sur Facebook
            • Partager sur Twitter
              3 mars 2021 à 10:08:38

              RazMockt a écrit:

              Il faut empêcher de récupérer ce qui est "avant l'occurrence < à 2020" (donc empêcher celle de 2017 d'être envoyée en résultat)...C'est là que je coince...

              C'est une simple clause WHERE ...

              SELECT
              	T1.CLE,
              	T1.DEBUT,
              	T1.SITUATION,
              	T2.DEBUT AS DEBUT_PRECEDENTE,
              	T2.SITUATION AS SITUATION_PRECEDENTE
              FROM
              	(
              		-- Début situation précédente par clé
              		SELECT
              			T1.CLE,
              			T1.DEBUT,
              			MAX( T2.DEBUT ) AS DEBUT_PRECEDENT
              		FROM
              			MATABLE T1
              				LEFT JOIN MATABLE T2
              					ON T1.CLE = T2.CLE
              					AND T1.DEBUT > T2.DEBUT
              					AND YEAR( T2.DEBUT ) < 2020
              		WHERE YEAR( T1.DATE ) = 2020
              		GROUP BY T1.CLE, T1.DEBUT
              	) AS P
              		 
              		INNER JOIN MATABLE T1
              			ON P.CLE = T1.CLE
              			AND P.DEBUT = T1.DEBUT
              		 
              		LEFT JOIN MATABLE T2
              			ON P.CLE = T2.CLE
              			AND P.DEBUT_PRECEDENT = T2.DEBUT
              ORDER BY
              	T1.CLE,
              	T1.DEBUT

              Ligne 19 et 20 rajoutée ici ...

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                28 avril 2021 à 18:14:31

                Hello,

                Merci pour ce retour.

                Je viens de tester la requête (Oracle 2.1.0.63 BM 63-73) et j'ai une erreur 

                ORA-00933: la commande SQL ne se termine pas correctement
                00933. 00000 -  "SQL command not properly ended"

                Du coup j'ai remplacé par "WITH TMP AS" (......) et j'ai adapté la requête.

                Par contre je n'avait pas vu mais là j'ai un résultat en colonne (colonne 1 = première DEBUT, colonne 2 = 2eme DEBUT...) or j'aimerai conserver le résultat en ligne, comme dans mon dernier exemple.

                Merci d'avance pour tout aide :-)

                :)

                • Partager sur Facebook
                • Partager sur Twitter
                  28 avril 2021 à 18:45:27

                  Ouch ... 2 mois après pour se remettre dedans c'est raide ...

                  Je ne comprends pas l'erreur, en général c'est un oubli de virgule ou un mot-clé ON absent ou une parenthèse non fermée.

                  Au passage, attention la fonction YEAR n'est pas valide sous Oracle.

                  Sinon, je ne comprends pas le souci ... Ma requête devient bien sortir les résultats en ligne, comme dans mon message précédent ...

                  Peux-tu poster la requête exacte exécutée et le résultat obtenu ?

                  • 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 DEBUT A LIMITER

                  × 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