Bonjour, non, votre union n'a pas fonctionné mais cela dit en bricolant à partir de votre code ma requête fonctionne enfin ! Inutile de vous dire que pour moi vous êtes l'homme de la journée !
Merci beaucoup
Eric.
Bonjour, non, votre union n'a pas fonctionné mais cela dit en bricolant à partir de votre code ma requête fonctionne enfin ! Inutile de vous dire que pour moi vous êtes l'homme de la journée !
Merci beaucoup
Eric.
Ravi de voir que vous avez pu vous en sortir.
Si vous pouviez nous fournir la requête qui vous donne le resultat voulu, ça pourrait peut être servir à d'autres personnes qui rencontreront le même souci
Bonjour, bien sûr je peux vous taper le code qui fonctionne, le voici :
J'obtiens ainsi 3 colonnes : cabinet / nombre de dossiers total / ,ombre de dossiers d'un certain type
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 SELECT T1.NUMERO_SIRET_CABINET,NOMBRE_DOSSIERS,NBVGE FROM (SELECT NUMERO_SIRET_CABINET, COUNT(*) AS NOMBRE_DOSSIERS FROM DOSSIERS.FIC GROUP BY NUMERO_SIRET_CABINET) T1 FULL OUTER JOIN (SELECT f1.NUMERO_SIRET_CABINET,COUNT(DISTINCT f1.ID_DOSSIER) AS NBVGE FROM DOSSIERS.FIC AS f1 FULL OUTER JOIN DANGEROSITE_DOSSIER.FIC AS f2 ON f1.ID_DOSSIER = f2.ID_DOSSIER WHERE (CODE_DANGEROSITE IN('CA3', 'LS3', 'DI3', 'SP4') AND DEFICIENCE_IMPUTABLE='1') AND CODE_GENRE IN('TAGE03', 'TAGE16', 'TAGE30') AND CODE_NATURE_EVENEMENT IN('TANE11', 'TANE12') AND ((DATE_RAPPORT_1A>='20090608' AND DATE_RAPPORT_1A<='20090614' AND DANGEROSITE_1A='1') OR (DATE_RAPPORT_1A='' AND DATE_RAPPORT_1B>='20090608' AND DATE_RAPPORT_1B<='20090614' AND DANGEROSITE_1B='1')) AND REPARABILITE_ECONOMIQUE = '1' GROUP BY f1.NUMERO_SIRET_CABINET) T2 ON T1.NUMERO_SIRET_CABINET = T2.NUMERO_SIRET_CABINET ;
Celà dit, j'ai encore un problème, au tout début du code il y a : FROM DOSSIERS.FIC. Ceci fonctionne mais si je rajoute juste :
FROM DOSSIERS.FIC
WHERE DATE_RAPPORT_1A>'20090608' il ne m'affiche plus rien (et pas de message d'erreur...)
Juste un petit WHERE le fait bugger. Auriez-vous une solution ?
Eric.
quelqu'un a t-il une idée ?
Si je remplace mon premier : DOSSIERS.FIC par (SELECT * FROM DOSSIERS.FIC) ca fonctionne mais si je mets : DOSSIERS.FIC WHERE... ou (SELECT* FROM DOSSIERS.FIC WHERE...) cela ne fonctionne plus :/
Eric.
Tu peux nous donner le texte exact de la requête qui ne fonctionne pas, ainsi que le message d'erreur éventuel ou le symptôme du dysfonctionnement ?
Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
Bonjour, le texte est le suivant :
si je remplace la 3è ligne par FROM DOSSIERS.FIC WHERE.. ca marche pas. Si je remplace par (SELECT * FROM DOSSIERS.FIC) ca marche. Si je remplace par (SELECT * FROM DOSSIERS.FIC WHERE...) ca marche pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 SELECT T1.NUMERO_SIRET_CABINET,NOMBRE_DOSSIERS,NBVGE FROM (SELECT NUMERO_SIRET_CABINET, COUNT(*) AS NOMBRE_DOSSIERS FROM DOSSIERS.FIC GROUP BY NUMERO_SIRET_CABINET) T1 LEFT OUTER JOIN (SELECT f1.NUMERO_SIRET_CABINET,COUNT(DISTINCT f1.ID_DOSSIER) AS NBVGE FROM DOSSIERS.FIC AS f1 LEFT OUTER JOIN DANGEROSITE_DOSSIER.FIC AS f2 ON f1.ID_DOSSIER = f2.ID_DOSSIER WHERE (CODE_DANGEROSITE IN('CA3', 'LS3', 'DI3', 'SP4') AND DEFICIENCE_IMPUTABLE='1') AND CODE_GENRE IN('TAGE03', 'TAGE16', 'TAGE30') AND CODE_NATURE_EVENEMENT IN('TANE11', 'TANE12') AND ((DATE_RAPPORT_1A>='20090608' AND DATE_RAPPORT_1A<='20090614' AND DANGEROSITE_1A='1') OR (DATE_RAPPORT_1A='' AND DATE_RAPPORT_1B>='20090608' AND DATE_RAPPORT_1B<='20090614' AND DANGEROSITE_1B='1')) AND REPARABILITE_ECONOMIQUE = '1' GROUP BY f1.NUMERO_SIRET_CABINET) T2 ON T1.NUMERO_SIRET_CABINET = T2.NUMERO_SIRET_CABINET ;
Je suis bien embeté car il faudrait que je puisse sélectionner une période de dates :p et une fois le count effectué je peux plus les récupérer donc faut absolument mettre le WHERE à cet endroit...
Sans préciser cette période de date, la requête n'a plus aucun sens :p
Eric.
S'il ne vous affiche plus rien, c'est peut être simplement qu'aucune ligne ne satisfait la condition.
Avez vous essayé de voir ce que vous renvoie la requête toute seule?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT NUMERO_SIRET_CABINET, COUNT(*) AS NOMBRE_DOSSIERS FROM DOSSIERS.FIC WHERE DATE_RAPPORT_1A>'20090608' GROUP BY NUMERO_SIRET_CABINET
Re, oui il donne bien une réponse avec votre morceau de requête :
400 cabinets, avec chacun entre 10 et 200 dans la valeur du count...
Je commence à y lacher des nerfs... à cause d'un petit where, plus rien ne fonctionne.... et sans raison !
Il n'y a pas une histoire de HAVING où on pourrait mettre HAVING DATE>'20090608'... ?
En rajoutant un COUNT(SVP !!) ca donnerait quelque chose de productif ? :p
HAVING agit sur le résultat du GROUP BY, pas sur les lignes individuelles.
HAVING COUNT(*) > 50 pourrait signifier quelque chose.
Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
Suis-je donc fichu ? Ca n'a pourtant pas l'air d'un problème si terrible à résoudre si ?
J'y suis depuis jeudi dernier..... et je ne désire qu'une seule chose c'est réussir à afficher 3 colonnes...
je vais vomir
Ce qui est bizarre c'est que T2 est une sous-requête autrement plus complexe que celle que tu veux faire en T1.
A tout hasard, essaie de mettre un alias sur DOSSIER.FIC dans la sous-requête T1 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 ( SELECT d.NUMERO_SIRET_CABINET, COUNT(*) AS NOMBRE_DOSSIERS FROM DOSSIERS.FIC d WHERE d.DATE_RAPPORT_1A > '20090608' GROUP BY d.NUMERO_SIRET_CABINET ) T1
Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
Désolé mais ca ne fonctionne toujours pas alors que votre morceau de requête seul fonctionne... je ne sais plus comment faire et je sens que tous ceux qui liront mes posts vont laisser tomber devant l'inextricable...
que faire ? :'(
Eric.
Il est vraiment bizarre ton SGBD !
Je sèche !
(non il ne pleut pas encore mais ça se couvre ! )
EDIT :
Euh... à tout hasard encore, essaie la syntaxe complète de l'alias de table (AS) :
Et prends l'habitude de répercuter le bon alias sur les noms de colonnes dans toute la requête. On ne sait jamais, ça peut aider le SGBD à éviter les confusions.
Code : Sélectionner tout - Visualiser dans une fenêtre à part FROM DOSSIERS.FIC AS d
Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
Je rejoins l'avis de Cinephil, ça donne pas envie de travailler sur Hyperfile.
Je t'invite à essayer un peu au hasard, même ce qui pourrait sembler tordu.
Par exemple, remonter la date dans t1, puis filtrer dans la requête principale, peut être que ça lui plaira plus...
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 SELECT t1.numero_siret_cabinet, sum(t1.nombre_dossiers) as nombre_dossiers, t2.nbvge FROM (SELECT f1.numero_siret_cabinet, f1.date_rapport_1a, Count(*) AS nombre_dossiers FROM dossiers.fic f1 GROUP BY f1.numero_siret_cabinet, f1.date_rapport_1a ) t1 LEFT OUTER JOIN ( SELECT f1.numero_siret_cabinet, Count(DISTINCT f1.id_dossier) AS nbvge FROM dossiers.fic AS f1 LEFT OUTER JOIN dangerosite_dossier.fic AS f2 ON f1.id_dossier = f2.id_dossier WHERE (code_dangerosite IN ('CA3','LS3','DI3','SP4') AND deficience_imputable = '1') AND code_genre IN ('TAGE03','TAGE16','TAGE30') AND code_nature_evenement IN ('TANE11','TANE12') AND ( (date_rapport_1a >= '20090608' AND date_rapport_1a <= '20090614' AND dangerosite_1a = '1' ) OR (date_rapport_1a = '' AND date_rapport_1b >= '20090608' AND date_rapport_1b <= '20090614' AND dangerosite_1b = '1') ) AND reparabilite_economique = '1' GROUP BY f1.numero_siret_cabinet ) t2 ON t1.numero_siret_cabinet = t2.numero_siret_cabinet WHERE t1.date_rapport_1a > '20090608' GROUP BY t1.numero_siret_cabinet, t2.nbvge;
Malheureusement non...
"Echec de l'execution de la requete
Erreur renvoyée par le serveur **** :
Erreur dans le code SQL <t2>. Initialisation de la reqête impossible"
Je vais C.R.A.Q.U.E.R
Eric.
Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
Dans l'idéal voilà ce qu'il me faudrait :
C'est le fait de mettre un WHERE à la 4è ligne qui fait qu'il ne se passe rien. Ca cherche pendant 15 secondes pi stop. Ca affiche le résultat de l'ancienne requete s'il j'en ai fait une avant (sinon pas de résultat). Pas de message d'erreur. Sans ce WHERE, j'ai la résultat de la requête en 5 secondes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 SELECT T1.NUMERO_SIRET_CABINET,NOMBRE_DOSSIERS,NBVGE FROM (SELECT NUMERO_SIRET_CABINET, COUNT(*) AS NOMBRE_DOSSIERS FROM DOSSIERS.FIC WHERE ((DATE_RAPPORT_1A>='20090608' AND DATE_RAPPORT_1A<='20090614') OR (DATE_RAPPORT_1A='' AND DATE_RAPPORT_1B>='20090608' AND DATE_RAPPORT_1B<='20090614')) GROUP BY NUMERO_SIRET_CABINET) T1 FULL OUTER JOIN (SELECT f1.NUMERO_SIRET_CABINET,COUNT(DISTINCT f1.ID_DOSSIER) AS NBVGE FROM DOSSIERS.FIC AS f1 FULL OUTER JOIN DANGEROSITE_DOSSIER.FIC AS f2 ON f1.ID_DOSSIER = f2.ID_DOSSIER WHERE (CODE_DANGEROSITE IN('CA3', 'LS3', 'DI3', 'SP4') AND DEFICIENCE_IMPUTABLE='1') AND CODE_GENRE IN('TAGE03', 'TAGE16', 'TAGE30') AND CODE_NATURE_EVENEMENT IN('TANE11', 'TANE12') AND ((DATE_RAPPORT_1A>='20090608' AND DATE_RAPPORT_1A<='20090614' AND DANGEROSITE_1A='1') OR (DATE_RAPPORT_1A='' AND DATE_RAPPORT_1B>='20090608' AND DATE_RAPPORT_1B<='20090614' AND DANGEROSITE_1B='1')) AND REPARABILITE_ECONOMIQUE = '1' GROUP BY f1.NUMERO_SIRET_CABINET) T2 ON T1.NUMERO_SIRET_CABINET = T2.NUMERO_SIRET_CABINET
Voilà, vous en savez autant que moi !
Eric.
Maintenant qu'on a la requête complète...
1) Est-ce que ce morceau (T1) donne un résultat correct :
2) Est-ce qu'il donne un complément d'information par rapport à la partie T2 ?
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 SELECT NUMERO_SIRET_CABINET, COUNT(*) AS NOMBRE_DOSSIERS FROM DOSSIERS.FIC WHERE ( ( DATE_RAPPORT_1A>='20090608' AND DATE_RAPPORT_1A<='20090614' ) OR ( DATE_RAPPORT_1A='' AND DATE_RAPPORT_1B>='20090608' AND DATE_RAPPORT_1B<='20090614' ) ) GROUP BY NUMERO_SIRET_CABINET
C'est à dire, puisqu'on est en FULL OUTER JOIN entre T1 et T2, des lignes supplémentaires à T2.
3) Est-ce que le résultat de la requête complète sans le WHERE devrait être différent d'avec ? A vérifier d'après le résultat de T1 seul et le résultat de T2 seul.
Voilà les dernières pistes à analyser qui me viennent à l'esprit.
A demain avec j'espère de bonnes nouvelles de ta part !
Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
Bonjour Cinéphil,
Je réponds dans l'ordre :
Oui la partie T1 donne un bon résultat.
Le FULL OUTER JOIN...
En fait ce que je veux c une colonne avec les NUMERO_SIRET_CABINET, une avec le nombre de dossiers envoyés (T1), et une avec un certain type de dossiers envoyés, parmi ceux envoyés (T2). Si la valeur de T1 est 300 pour un NMERO_SIRET_CABINET, la valeur de T2 peut être inexistante s'il n'y en a pas. Donc dans T2 il y a un nombre inférieur ou égal de lignes (dans la réalité il y en a forcément moins). Donc ca doit répondre à votre question
Enfin, oui le résultat sans le WHERE est différent c'est pour cette raison qu'il me faut impérativement pouvoir l'inclure...
Si jamais vous avez envie de laisser tomber... je peux le comprendre mais je me vois mal expliquer à mon chef que je ne peux pas àcoller 3 colonnes :/ Je suis dessus depuis jeudi dernier.. :'(
Eric.
Dans ce cas un LEFT OUTER JOIN est suffisant.Si la valeur de T1 est 300 pour un NMERO_SIRET_CABINET, la valeur de T2 peut être inexistante s'il n'y en a pas. Donc dans T2 il y a un nombre inférieur ou égal de lignes (dans la réalité il y en a forcément moins).
Vous pouvez également reprendre la syntaxe utilisant l'union que je vous avais proposé, et remplacer "UNION ALL" par "UNION".
Si ça ne fonctionne pas, merci de préciser les symptômes
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager