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 :

Résultat requête SQL pas satisfaisant


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Jeune retraité, anciennement Analyste fonctionnel Mainframe et développeur COBOL / BULL/IBM/HP
    Inscrit en
    Février 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Jeune retraité, anciennement Analyste fonctionnel Mainframe et développeur COBOL / BULL/IBM/HP

    Informations forums :
    Inscription : Février 2009
    Messages : 48
    Points : 39
    Points
    39
    Par défaut Résultat requête SQL pas satisfaisant
    Bonjour aux Boss du SQL,

    Sur la requête suivante, j'obtiens le résultat qui ne satisfait pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT DATSOR, MOIS, JOUR, JORD, NATJOUR
    FROM LCO_CALENDRIER
    WHERE
    JORD IN
        (SELECT MAX(JORD) FROM LCO_CALENDRIER
            WHERE NATJOUR = 1 AND JORD <=
                        (SELECT JORD
                                    FROM LCO_CALENDRIER
                                            WHERE DATSOR = '20141003') -2
        );
    DATSOR MOIS JOUR JORD NATJOUR
    -----------------------------------------------
    20111001 10 1 274 2
    20120930 9 30 274 2
    20131001 10 1 274 1
    20141001 10 1 274 1 <== enregistrement unique souhaité
    20151001 10 1 274 1


    Je souhaite obtenir l'enregistrement unique dans la table CALENDRIER avec en date
    de traitement '20141003' ayant un NATJOUR = 1 (jour ouvré) à - 2 jour.

    Le résultat me ramène 5 Rows, et j'aimerai trouvé uniquement une seule ligne,
    soit celle à la date 'DATSOR ou date de traitement) = à 20141001 avec la
    NATJOUR (1= jour ouvré, 2= jour férié) ) soit celui précisé avec '<==='.


    Auriez vous une solution à me proposer ?

    Merci d'avance
    HULK77

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Première réponse rapide : Rajoute une restriction sur l'année
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT DATSOR, MOIS, JOUR, JORD, NATJOUR
    FROM LCO_CALENDRIER
    WHERE JORD IN (SELECT MAX(JORD) 
    			FROM LCO_CALENDRIER
                    WHERE NATJOUR = 1 
                    AND JORD <= (SELECT JORD FROM LCO_CALENDRIER WHERE DATSOR = '20141003') -2
                    AND extract(YEAR FROM datsor) = 2014
                   )
    AND extract(YEAR FROM datsor) = 2014
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Après analyse plus poussée, la restriction sur l'année n'est pas valable pour le début de l'année.
    Voici une requête correcte.
    Enfin tout dépend comment est défini la colonne datsor : Date ? Varchar2 ? Number ?
    La requête suivante considère que datsor (vu ton code), est en VARCHAR2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT 
     MAX(DATSOR) KEEP (DENSE_RANK FIRST ORDER BY datesor desc) datsor,
     MAX(MOIS) KEEP (DENSE_RANK FIRST ORDER BY datesor desc) mois,
     MAX(JOUR) KEEP (DENSE_RANK FIRST ORDER BY datesor desc) jour,
     MAX(JORD) KEEP (DENSE_RANK FIRST ORDER BY datesor desc) jord,
     MAX(NATJOUR) KEEP (DENSE_RANK FIRST ORDER BY datesor desc) natjour
    FROM LCO_CALENDRIER
    WHERE NATJOUR = 1 
    AND datsor <= TO_CHAR(TO_DATE('03/10/2014','DD/MM/RRRR') - 2, 'RRRRMMDD')
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Jeune retraité, anciennement Analyste fonctionnel Mainframe et développeur COBOL / BULL/IBM/HP
    Inscrit en
    Février 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Jeune retraité, anciennement Analyste fonctionnel Mainframe et développeur COBOL / BULL/IBM/HP

    Informations forums :
    Inscription : Février 2009
    Messages : 48
    Points : 39
    Points
    39
    Par défaut Résultat Requête pas satisfaisant, maintenant, c'est OK
    Bonjour McM,

    Merci pour cette info, j'ai effectivement ajouté un filtre sur l'année et le mois que je connais de part la date de traitement (dans mon cas = 201410), avec '1' dans le champ NATJOUR (soit les jours ouvrés)
    ce qui me réduit le résultat à 3 ou 4 éléments.
    Pas encore satisfaisant.

    J'y ai donc rajouté une restriction ROWNUM=1 afin d'obtenir un seul élément en sortie qui est trié en Desc, ci qui me ramène un ROW le plus proche de ma date voulue.
    Pour info cette date est déclarée en type CHAR 8 byte, null par default)

    Voici ce que cela donne en requête :

    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
               EXEC SQL
                     SELECT DATSOR, ANNEE, MOIS, JOUR, NATJOUR
                            INTO :CO010-DATSOR ,
                                 :CO010-ANNEE  ,
                                 :CO010-MOIS   ,
                                 :CO010-JOUR   ,
                                 :CO010-NATJOUR
                      FROM  (
                            SELECT DATSOR, ANNEE, MOIS, JOUR, NATJOUR
                              FROM LCO_CALENDRIER
                            WHERE
                              ANNEE       = :W-SSAA  AND
                              MOIS         = :W-MOIS  AND
                              NATJOUR   = '1'            AND
                              DATSOR  <= :W-DATE48H
                              ORDER BY DATSOR DESC
    						)
                      WHERE ROWNUM =1
               END-EXEC.
    Merci en tout cas, c'est OK pour moi.

    HULK77
    Ma fabrique de chemise tourne à plein régime



    Citation Envoyé par McM Voir le message
    Après analyse plus poussée, la restriction sur l'année n'est pas valable pour le début de l'année.
    Voici une requête correcte.
    Enfin tout dépend comment est défini la colonne datsor : Date ? Varchar2 ? Number ?
    La requête suivante considère que datsor (vu ton code), est en VARCHAR2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT 
     MAX(DATSOR) KEEP (DENSE_RANK FIRST ORDER BY datesor desc) datsor,
     MAX(MOIS) KEEP (DENSE_RANK FIRST ORDER BY datesor desc) mois,
     MAX(JOUR) KEEP (DENSE_RANK FIRST ORDER BY datesor desc) jour,
     MAX(JORD) KEEP (DENSE_RANK FIRST ORDER BY datesor desc) jord,
     MAX(NATJOUR) KEEP (DENSE_RANK FIRST ORDER BY datesor desc) natjour
    FROM LCO_CALENDRIER
    WHERE NATJOUR = 1 
    AND datsor <= TO_CHAR(TO_DATE('03/10/2014','DD/MM/RRRR') - 2, 'RRRRMMDD')

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Jeune retraité, anciennement Analyste fonctionnel Mainframe et développeur COBOL / BULL/IBM/HP
    Inscrit en
    Février 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Jeune retraité, anciennement Analyste fonctionnel Mainframe et développeur COBOL / BULL/IBM/HP

    Informations forums :
    Inscription : Février 2009
    Messages : 48
    Points : 39
    Points
    39
    Par défaut Complément d'info sur résultat requete pas satisfaisant
    Bonjour McM,

    Effectivement, j'ai constaté que sur quand je tombe sur les 3 premiers jours du mois et en plus le cas d'un WE en début de mois, je ne trouve rien en résultat de ma requête.
    Je suis obligé donc de traiter ses quelques cas en manuel en recalculant la date (-1 mois, et + ou - 1 ou 2 jours sur les derniers jours du nouveau mois (-1), ensuite, je refais la requête
    qui me ramène mon occurrence, qui est la date voulue.

    J'avais oublié de préciser ce fait pour la bonne compréhension du problème par tous.

    Merci de ton regard.

    Cordialement
    HULK77
    Ma fabrique de chemise tourne à plein régime

  6. #6
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Euh, ma seconde requête avec le dense_rank doit être juste. Pourquoi tu ne l'utilises pas ?
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Jeune retraité, anciennement Analyste fonctionnel Mainframe et développeur COBOL / BULL/IBM/HP
    Inscrit en
    Février 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Jeune retraité, anciennement Analyste fonctionnel Mainframe et développeur COBOL / BULL/IBM/HP

    Informations forums :
    Inscription : Février 2009
    Messages : 48
    Points : 39
    Points
    39
    Par défaut Complément info sur résultat requête pas satisfaisant
    Bjr McM,

    N'étant plus sur site, je ne pourrai pas.
    Néanmoins, j'ai une copie de la base, et je testerai la requête dès que j'aurai résolu mon problème de connexion(Erreur E/S) suite à mon
    installation de Sql Developer sur mon PC (première fois).
    J'importerai les copies des tables, afin de faire les tests.

    Merci
    Cordialement

    HULK77
    Ma fabrique de chemise tourne à plein régime


    Citation Envoyé par McM Voir le message
    Euh, ma seconde requête avec le dense_rank doit être juste. Pourquoi tu ne l'utilises pas ?

Discussions similaires

  1. [MySQL] Affichage résultat requête SQL dans page HTML comme un tableau
    Par joxbl dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 14/03/2011, 14h26
  2. Réponses: 2
    Dernier message: 07/02/2008, 11h45
  3. Réponses: 13
    Dernier message: 28/09/2007, 11h55
  4. [SQL]requête SQL pas refusée
    Par schwarzy2 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 04/04/2007, 22h54
  5. résultat requêtes sql
    Par mmb04 dans le forum JDBC
    Réponses: 11
    Dernier message: 22/03/2007, 16h06

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