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 :

Identifier rang non concordant avec les dates [11gR2]


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 26
    Par défaut Identifier rang non concordant avec les dates
    Bonjour à tous,


    Cela fait des mois que je parcours le forum et je vous remercie tous pour toutes ces informations où on n'a même pas besoin de poser de questions complémentaire tellement les réponses sont précises.

    Un prestataire m'a solutionné mon problème mais je ne connaissait pas cette syntaxe où on fait un SELECT <nom_table>
    Je l'ai relu plusieurs fois et je n'arrive pas à comprendre pourquoi ça fonctionne en me retournant les valeurs effectivement en anomalie.
    Les LKLO sont en anomalie quand l'ordre des dates en CDECL ne concorde pas avec le rang en CRNG

    Ce n'est pas de la magie mais je là je n'arrive pas saisir la subtilité. Pouvez-vous m'expliquer pourquoi ça fonctionne ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT DISTINCT lklo
    FROM  kcntloc l
    WHERE EXISTS  ( SELECT 1
                    FROM  kcntloc l2
                    WHERE l2.lklo = l.lklo
                    AND   l2.ctct = l.ctct
                    AND   l2.cdecl < l.cdecl
                    AND   l2.crng > l.crng )
    AND   ctct IN ( 'L', 'A' )
    Jeux de donnée où le rang (CRNG) n°8 est arrivé avant le rang n°7 (voir date en CDECL)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CTCT	CNCT		LKLO	CRNG	CDECL		CDPCL		MCDP	CDSCL
    L	2415		AF17	1	01/03/78	28/02/96	DE	28/02/96
    L	9500490		AF17	2	01/03/96	31/10/96	CH	31/10/96
    L	9500856		AF17	3	01/11/96	31/03/99	DE	31/03/99
    L	9900152		AF17	4	01/05/99	09/08/11	DE	09/08/11
    L	3200049		AF17	5	01/03/12	08/03/12	DE	31/03/12
    L	3200149		AF17	6	01/07/12	21/02/13	DE	21/03/13
    L	3300117		AF17	8	23/05/13	01/12/14	DE	02/03/15
    L	3500009		AF17	7	03/03/15
    Résultat du SQL :

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 175
    Par défaut
    Bonjour,

    En fait ici on utilise une condition EXISTS pour aller chercher sur la même table les lignes qui, pour un même couple (lklo, ctct), ont un rang supérieur aux autres lignes tel que la date CDECL soit antérieure à celle d'au moins une autre ligne.
    Le language SQL est très proche du langage naturel, donc tu peux presque énoncer de manière naturelle la requête:

    SELECTionne les valeurs distinctes de LKLO de la table kcntloc pour laquelle il EXISTe au moins une ligne, pour un même couple (lklo, ctct), tels que le rang CRNG soit supérieur ET la date CDECL soit inférieure aux valeurs CRNG et CDECL respectivement d'au moins une autre ligne du couple.

    Si le SQL est assez proche du langage naturel, tes colonnes elles le sont beaucoup moins. Pourquoi des noms comme ça qui ne veulent pas dire grand chose?

  3. #3
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 26
    Par défaut
    Merci Vanagreg, je cherchais plus compliqué et expliqué comme ça je me rend compte que ce n'était pas si complexe que ça.

    Le nom des champs est imposé. C'est pour un gros ERP qui trace toutes les données depuis plus de 30 ans. Plus de 3000 tables à explorer, sans parler des vues et procédures. Je n'ai pas fini de m'y perdre.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Si vous voulez réfléchir encore un peu, méditez sur cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    with cte_rn (LKLO, rn_CRNG, rn_CDECL) as
    (
    select LKLO
         , row_number() over(partition by CTCT, LKLO order by CRNG  asc) as rn_CRNG
         , row_number() over(partition by CTCT, LKLO order by CDECL asc) as rn_CDECL
      from kcntloc
     where ctct in ('L', 'A')
    )
    select distinct LKLO
      from cte_rn
     where rn_CRNG <> rn_CDECL;

  5. #5
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 26
    Par défaut
    Ha oui joli

    Si j'ai bien compris on fait :
    1. Création d'une sous-requête où le jeu de donnée sera dans cte_rn
    2. On récupère le n° de ligne des rangs classé par ordre croissant
    3. On récupère le n° de ligne des dates classé par ordre croissant
    4. Le n° de ligne du rang et date est stocké dans une variable différente
    5. On sort de la sous requête et on interroge le jeu de donnée
    6. Si les n° de ligne sont différent c'est que l'ordre chronologique des dates et l'ordre numérique des rangs n'est pas respecté


    Je vais noter ça dans ma trousse à outils... merci pour le partage

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

Discussions similaires

  1. Help!! Probleme avec les dates sur SQL SERVER
    Par Nadaa dans le forum MS SQL Server
    Réponses: 16
    Dernier message: 03/08/2006, 16h55
  2. Builder/Interb :"Non Concordance dans les paquets de do
    Par pjtuloup dans le forum C++Builder
    Réponses: 4
    Dernier message: 08/03/2005, 09h53
  3. [SQL] problème avec les date et les group By
    Par Stef784ever dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/11/2004, 09h18
  4. Pb avec les dates < année 2000
    Par elitost dans le forum Oracle
    Réponses: 2
    Dernier message: 15/09/2004, 12h37
  5. Interbase - dbExpress -> problème avec les dates
    Par marghett dans le forum Bases de données
    Réponses: 4
    Dernier message: 02/07/2004, 03h55

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