Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/03/2011, 12h57   #1
Membre habitué
 
Avatar de PoichOU
 
Homme PoichOU
Étudiant
Inscription : juillet 2006
Messages : 296
Détails du profil
Informations personnelles :
Nom : Homme PoichOU
Âge : 24
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : Associations - ONG

Informations forums :
Inscription : juillet 2006
Messages : 296
Points : 114
Points : 114
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
PoichOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 13h28   #2
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
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 :
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 !
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 14h09   #3
Membre habitué
 
Avatar de PoichOU
 
Homme PoichOU
Étudiant
Inscription : juillet 2006
Messages : 296
Détails du profil
Informations personnelles :
Nom : Homme PoichOU
Âge : 24
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : Associations - ONG

Informations forums :
Inscription : juillet 2006
Messages : 296
Points : 114
Points : 114
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 :
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
PoichOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 14h17   #4
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Et comme çà ?
Code :
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
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 14h32   #5
Membre habitué
 
Avatar de PoichOU
 
Homme PoichOU
Étudiant
Inscription : juillet 2006
Messages : 296
Détails du profil
Informations personnelles :
Nom : Homme PoichOU
Âge : 24
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : Associations - ONG

Informations forums :
Inscription : juillet 2006
Messages : 296
Points : 114
Points : 114
GENIAL !! et en plus sans BDD je dis respect !


merci beaucoup pour le coup de main
PoichOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 14h47   #6
Membre habitué
 
Avatar de PoichOU
 
Homme PoichOU
Étudiant
Inscription : juillet 2006
Messages : 296
Détails du profil
Informations personnelles :
Nom : Homme PoichOU
Âge : 24
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : Associations - ONG

Informations forums :
Inscription : juillet 2006
Messages : 296
Points : 114
Points : 114
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 ?
PoichOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 14h52   #7
Membre habitué
 
Avatar de PoichOU
 
Homme PoichOU
Étudiant
Inscription : juillet 2006
Messages : 296
Détails du profil
Informations personnelles :
Nom : Homme PoichOU
Âge : 24
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : Associations - ONG

Informations forums :
Inscription : juillet 2006
Messages : 296
Points : 114
Points : 114
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
PoichOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 15h19   #8
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Merci d'avoir précisé, s'il n'y a pas de soucis à utiliser DISTINCT dans une fonction analytique, alors :
Code :
count(DISTINCT fe.ligne) over (partition BY f.id) AS nberreur
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 15h54   #9
Membre habitué
 
Avatar de PoichOU
 
Homme PoichOU
Étudiant
Inscription : juillet 2006
Messages : 296
Détails du profil
Informations personnelles :
Nom : Homme PoichOU
Âge : 24
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : Associations - ONG

Informations forums :
Inscription : juillet 2006
Messages : 296
Points : 114
Points : 114
MERCI MERCI MERCI
PoichOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h47.


 
 
 
 
Partenaires

Hébergement Web