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 :

Besoin d'aide pour une requête (si c'est faisable)


Sujet :

SQL Oracle

  1. #1
    Membre éclairé Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Par défaut Besoin d'aide pour une requête (si c'est faisable)
    Bonjour,

    j'ai besoin d'aide pour une requête car je voudrais améliorer le temps d'affichage d'une page.
    Sur mon site internet j'ai une petite fonctionnalité qui me permet d'importer des fichiers xml contenant des factures (chaque fichier contient une ou plusieurs factures).
    Les fichiers xml ne sont pas toujours bien importés (problème de formattage ou autre), et peuvent être importés partiellement (cad certaines factures sont importées, d'autres non).

    Voici comment cela est modélisé (désolé pour l'image je n'avais pas de logiciel pour faire un mpd alors j'ai fait comme je pouvais) :

    J'ai importé 3 fichiers :
    - le 1er a 2 factures et il a été importé sans problème
    - le 2nd a 3 factures et il a été rejeté complément (le fichier xml était illisible)
    - le 3eme a 5 factures et 2 ont été intégrées et 3 rejetées



    La page dont je veux améliorer le temps d'affichage est une sorte de tableau de bord des importations qui affiche des infos sur les fichiers importés.



    Je voudrais faire une requête qui afficherait le résultat suivant :

    cad une ligne par erreur avec à chaque fois l'erreur rencontrée et le nombre de factures intégrées

    pour l'instant je fais ce traitement avec plusieurs requêtes et du traitement php mais je pense (je ne suis pas du tout spécialiste) que ça doit être faisable directement en sql (et donc améliorer le temps de traitement).

    Pourriez-vous m'aider ?

    Merci
    PoichOU

    PS : j'espère avoir été clair dans ma demande

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 952
    Par défaut
    Essaie avec ça, mais je n'ai pas testé, c'est donc peut être faux au niveau du nombre de lignes et de nberreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select f.id as id_fichier,
           f.nom as nom_fichier,
           fs.libelle as libelle_statut,
           (select count(*) from facture fa where fa.id_fichier = f.id) as nbfacture,
           fet.libelle as libelle_erreur,
           fe.ligne,
           count(fe.id) over (partition by f.id) as nberreur
      from fichier f
      join fichier_statut fs on f.statut = fs.code
      left join fichier_erreur fe on f.id = fe.id_fichier
      join fichier_erreur_type fet on fe.type_erreur = fet.code
    Si ça n'est pas bon merci de poster le résultat de la requête.

    PS : oui c'est très clair !

  3. #3
    Membre éclairé Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Par défaut
    merci beaucoup skuatamad pour ta réponse (rapide en plus !).

    Ta requête fonctionne presque, il ne manque que la première ligne (le fichier ok).
    Mais c'est ma faute je n'ai pas précisé qu'en cas de succès il n'y a pas de ligne dans 'fichier_erreur'.


    je te file un script de création si ça peut aide (parce que faire la requête sans tester moi je dis respect )

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    CREATE TABLE FICHIER_ERREUR_TYPE
    (
        code                 INTEGER	                    NOT NULL,
    	libelle              VARCHAR(256)                   NOT NULL,
        CONSTRAINT PK_FICHIER_ERREUR_TYPE PRIMARY KEY (code)
    );
     
    CREATE TABLE FICHIER_STATUT
    (
        code                 VARCHAR(50)                    NOT NULL,
    	libelle              VARCHAR(256)                   NOT NULL,
        CONSTRAINT PK_FICHIER_STATUT PRIMARY KEY (code)
    );
     
    CREATE TABLE FICHIER 
    (
        id                   INTEGER                        NOT NULL,
        nom                  VARCHAR(256)                   NOT NULL,
        statut               VARCHAR(50)                    NOT NULL,
        CONSTRAINT PK_FICHIER PRIMARY KEY (id)
    );
     
    CREATE TABLE FACTURE 
    (
        id                   INTEGER                        NOT NULL,
        id_fichier           INTEGER                        NOT NULL,
        montant              NUMBER(33,10)                  NOT NULL,
        CONSTRAINT PK_FACTURE PRIMARY KEY (id)
    );
     
    CREATE TABLE FICHIER_ERREUR 
    (
        id                   INTEGER                        NOT NULL,
        id_fichier           INTEGER                        NOT NULL,
        type_erreur          INTEGER						NOT NULL,
        ligne				 VARCHAR(50)							,
        CONSTRAINT PK_FICHIER_ERREUR PRIMARY KEY (id)
    );
     
     
    INSERT INTO "FICHIER_STATUT" (CODE, LIBELLE) VALUES ('INTEGRATED', 'fichier intégré');
    INSERT INTO "FICHIER_STATUT" (CODE, LIBELLE) VALUES ('REJECTED', 'fichier rejeté');
    INSERT INTO "FICHIER_STATUT" (CODE, LIBELLE) VALUES ('PARTIALLY', 'fichier partiellement intégré');
     
     
    INSERT INTO "FRIDEV5"."FICHIER_ERREUR_TYPE" (CODE, LIBELLE) VALUES ('1', 'format incorrect');
    INSERT INTO "FRIDEV5"."FICHIER_ERREUR_TYPE" (CODE, LIBELLE) VALUES ('2', 'valeur non reconnue');
    INSERT INTO "FRIDEV5"."FICHIER_ERREUR_TYPE" (CODE, LIBELLE) VALUES ('3', 'valeur non authorisée');
     
     
    INSERT INTO "FRIDEV5"."FICHIER" (ID, NOM, STATUT) VALUES ('1', 'testOK.xml', 'INTEGRATED');
    INSERT INTO "FRIDEV5"."FICHIER" (ID, NOM, STATUT) VALUES ('2', 'testKO.xml', 'REJECTED');
    INSERT INTO "FRIDEV5"."FICHIER" (ID, NOM, STATUT) VALUES ('3', 'testPARTIEL.xml', 'PARTIALLY');
     
    INSERT INTO "FRIDEV5"."FACTURE" (ID, ID_FICHIER, MONTANT) VALUES ('1', '1', 10.00);
    INSERT INTO "FRIDEV5"."FACTURE" (ID, ID_FICHIER, MONTANT) VALUES ('2', '1', 50.00);
    INSERT INTO "FRIDEV5"."FACTURE" (ID, ID_FICHIER, MONTANT) VALUES ('3', '3', 78.50);
    INSERT INTO "FRIDEV5"."FACTURE" (ID, ID_FICHIER, MONTANT) VALUES ('4', '3', 13.00);
     
     
    INSERT INTO "FRIDEV5"."FICHIER_ERREUR" (ID, ID_FICHIER, TYPE_ERREUR,ligne) VALUES ('1', '2', '1',null);
    INSERT INTO "FRIDEV5"."FICHIER_ERREUR" (ID, ID_FICHIER, TYPE_ERREUR,ligne) VALUES ('2', '3', '2','10');
    INSERT INTO "FRIDEV5"."FICHIER_ERREUR" (ID, ID_FICHIER, TYPE_ERREUR,ligne) VALUES ('3', '3', '3','15');
    INSERT INTO "FRIDEV5"."FICHIER_ERREUR" (ID, ID_FICHIER, TYPE_ERREUR,ligne) VALUES ('4', '3', '3','16');
    Un GRAND merci à toi

    PoichOU

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 952
    Par défaut
    Et comme çà ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT f.id AS id_fichier,
           f.nom AS nom_fichier,
           fs.libelle AS libelle_statut,
           (SELECT count(*) FROM facture fa WHERE fa.id_fichier = f.id) AS nbfacture,
           fet.libelle AS libelle_erreur,
           fe.ligne,
           count(fe.id) over (partition BY f.id) AS nberreur
      FROM fichier f
      JOIN fichier_statut fs ON f.statut = fs.code
      LEFT JOIN fichier_erreur fe ON f.id = fe.id_fichier
      LEFT JOIN fichier_erreur_type fet ON fe.type_erreur = fet.code
    Merci pour le code de création des tables ça servira peut à qulqu'un d'autres mais moi je n'ai pas de base sous la main

  5. #5
    Membre éclairé Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Par défaut
    GENIAL !! et en plus sans BDD je dis respect !


    merci beaucoup pour le coup de main

  6. #6
    Membre éclairé Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Par défaut
    Erf j'ai fait une erreur, j'ai volontairement simplifié le modèle pour que mon exemple soit compréhensible et je suis passé à côté d'un truc !

    En fait dans les fichiers xml qui sont intégrés il y a une facture par ligne et je note dans la table d'erreur la ligne ET la colonne qui posent problème.
    Et dans ma requête il me faut le nombre de facture en erreur et non pas le nombre d'erreurs par fichier. Tu vois ce que je veux dire ?

  7. #7
    Membre éclairé Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Par défaut
    j'ai refait le mdp pour etre plus clair :

    en fait je peux avoir 2 lignes dans FICHIER_ERREUR pour une même facture !

    du coup le résultat serait du genre :


    je suis peut être plus clair là. Tu penses que c'est faisable ?

    Merci
    PoichOU

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 952
    Par défaut
    Merci d'avoir précisé, s'il n'y a pas de soucis à utiliser DISTINCT dans une fonction analytique, alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    count(distinct fe.ligne) over (partition BY f.id) AS nberreur

  9. #9
    Membre éclairé Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Par défaut
    MERCI MERCI MERCI

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

Discussions similaires

  1. Besoin d'aide pour une requête de MAJ (modif. de car.)
    Par ptitscrat dans le forum Access
    Réponses: 5
    Dernier message: 22/03/2006, 17h27
  2. besoin d'aide pour une requête
    Par lipao17 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 04/01/2006, 16h55
  3. Besoin d'aide pour une requête SQL
    Par Borami dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/11/2005, 10h33
  4. Besoin d'aide pour une Requête SQL ...
    Par Kokito dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/07/2004, 11h56
  5. besoin d'aide pour une requête
    Par Damien69 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 31/03/2004, 15h38

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