Pb Requete SQL !!!!

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Pb Requete SQL !!!!

par TOMITOMAS » 14 mars 2006, 20:49

c'est bon !!!!!!!!!! :D :pouce:

tout est résolu, tout fonctionne comme je voulais !!!

merci beaucoup a vous deux !!!
:love5:

par TOMITOMAS » 14 mars 2006, 18:29

non il aime pas du tout !!!!

ce n'est pas un copier/coller que je fais ! apres avoir choisit l'option 'tablo croisé dynamique' tu peux prendre une autre option 'exporter vers excel'

j'ai plus ou moins trouvé d'ou ca venait !!
il faudrait que je puisse avoir

Code : Tout sélectionner

SELECT f.date, f.BA, f.vendeur, t1.ACCEPTES, t2.REFUSES [.........] GROUP BY f.date, f.BA, f.vendeur /*****, t1.ACCEPTES, t2.REFUSES*****/ ;
donc arriver a enlever /* ... */ , pcq ce qu'il me balance sur excel avec le Group by qu'il y a, c'est le nombre de fois ou le chiffre apparait (=> donc une fois pour chaque ligne ! logique) j'espere que tu vois ce que je veux dire ??!!! ce n'est pas facil a expliquer !! :s
ce qu'il me faudrait c'est qu'il me retourne la somme qu'il a fait dans les 'SELECT ' du dessous, donc la valeur de t1.ACCEPTES et t2.REFUSES.

:roll: ???

par Hubert Roksor » 14 mars 2006, 18:08

Les jointures ne déterminent pas par elles-mêmes les performances d'un requêtes. Les facteurs les plus importants sont la facilité d'accès aux données (chemin le plus court pour trouver les infos) et la quantité de données à traiter. Selon l'optimiseur d'Accès, il se pourrait qu'il exécute le "SELECT * ..." pour chaque enregistrement examiné, alors qu'une jointure n'examinera que les enregistrements pertinents.

Pour ton problème de copier/coller, ça ressemble bien à problème lié à l'interface (Windows/Office donc). À tout hasard, change le type de colonne dans Excel en chaîne texte, plutôt qu'en valeur numérique pour voir s'il s'agit d'un problème de conversion. Access te permet aussi peut-être d'exporter au format CSV, compatible avec Excel. Sans oublier qu'Excel doit certainement pouvoir s'interfacer avec Access sans intervention humaine du style "copier/coller".

Tu peux essayer ça aussi:

Code : Tout sélectionner

SELECT f.date, f.BA, f.vendeur, CAST t1.ACCEPTES AS INTEGER, CAST t2.REFUSES AS INTEGER

par TOMITOMAS » 14 mars 2006, 17:10

mais le faite qu'il y ait autant de jointure ne risque pas de faire ramer la requete davantage ??

j'ai rajouté la contrainte sur les dates, car les stats que je désire faire sont sur une semaine donc voici le dernier code

Code : Tout sélectionner

SELECT f.date, f.BA, f.vendeur, t1.ACCEPTES, t2.REFUSES FROM (finance AS f LEFT JOIN [SELECT finance.date, finance.BA, finance.vendeur, Count(finance.BA) AS ACCEPTES FROM finance WHERE finance.NumCarte Not IN (SELECT * FROM ACTIVITE) AND finance.NumAuto Not IN (SELECT * FROM AUTO) and finance.date>=debut and finance.date<=fin GROUP BY finance.date, finance.BA, finance.vendeur ]. AS t1 ON (t1.date=f.date) AND (t1.vendeur=f.vendeur)) LEFT JOIN [SELECT finance.date, finance.BA, finance.vendeur, Count(finance.BA) AS REFUSES FROM finance WHERE finance.NumAuto IN (SELECT * FROM AUTO) and finance.date>=debut and finance.date<=fin GROUP BY finance.date, finance.BA, finance.vendeur ]. AS t2 ON (t2.date=f.date) AND (t2.vendeur=f.vendeur) WHERE f.date>=debut and f.date<=fin GROUP BY f.date, f.BA, f.vendeur, t1.ACCEPTES, t2.REFUSES;
qu'est ce que tu en penses ??

a savoir que j'ai maintenant un nouveau pb :
les résultats que ca me retourne sont bon. mais je veux pouvoir les exploiter plus facilement que le résultat que ca renvoie. j'uitilise donc la fonction 'affichage tableau croisé dynamique". jusque là tout va bien les résultats sont tjs correctes, le seul soucis, c'est lorsque je balance tout ca vers excel !....
au lieu de me recopier les données, il me met des '1' dans les cases ou apparaissent un nombre
par ex : sous access en date du 03/03/06 thomas a eu 5 dossiers acceptés
sur excel j'aurai date du 03/03/06 thomas 1 accepté

nouveau petit défi ??
ca vient du code ou juste de la bascule access/excel qui merde un peu ??

par Hubert Roksor » 14 mars 2006, 16:24

Remercie surtout Cyrano, s'il n'avait pas débroussaillé l'horrible SQL généré par Access je n'aurais même pas lu ton post :lol:

À part ça, les performances sur de gros fichiers vont être désastreuses. Je n'ai aucune idée du fonctionnement de l'optimiseur d'Access (ni même du niveau de SQL implémenté, cf. USING et COALESCE), tu peux peut-être remplacer les "WHERE champs1 NOT IN (SELECT * FROM table)" par quelque chose comme

Code : Tout sélectionner

SELECT f.BA, f.vendeur, t1.ACCEPTES, t2.REFUSES FROM (finance f LEFT JOIN ( SELECT finance.BA, finance.vendeur, Count(finance.BA) AS ACCEPTES FROM finance WHERE NOT EXISTS (SELECT * FROM ACTIVITE WHERE ACTIVITE.activite = finance.NumCarte) AND NOT EXISTS (SELECT * FROM AUTO WHERE AUTO.rens = finance.NumAuto) GROUP BY finance.BA, finance.vendeur ) AS t1 ON (t1.vendeur = f.vendeur) ) LEFT JOIN ( SELECT finance.BA, finance.vendeur, Count(finance.BA) AS REFUSES FROM finance, AUTO WHERE finance.NumAuto = AUTO.rens GROUP BY finance.BA, finance.vendeur ) AS t2 ON (t2.vendeur = f.vendeur) GROUP BY f.BA, f.vendeur, t1.ACCEPTES, t2.REFUSES;

Code : Tout sélectionner

SELECT f.BA, f.vendeur, t1.ACCEPTES, t2.REFUSES FROM (finance f LEFT JOIN ( SELECT finance.BA, finance.vendeur, Count(finance.BA) AS ACCEPTES FROM (finance LEFT JOIN ACTIVITE ON ACTIVITE.activite = finance.NumCarte ) LEFT JOIN AUTO ON AUTO.rens = finance.NumAuto WHERE ACTIVITE.activite IS NULL AND AUTO.rend IS NULL GROUP BY finance.BA, finance.vendeur ) AS t1 ON (t1.vendeur = f.vendeur) ) LEFT JOIN ( SELECT finance.BA, finance.vendeur, Count(finance.BA) AS REFUSES FROM finance, AUTO WHERE finance.NumAuto = AUTO.rens GROUP BY finance.BA, finance.vendeur ) AS t2 ON (t2.vendeur = f.vendeur) GROUP BY f.BA, f.vendeur, t1.ACCEPTES, t2.REFUSES;

par TOMITOMAS » 14 mars 2006, 15:37

CA FONCTIONNE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

merci a toi Hubert Roksor tu es mon sauveur !!! :p
merci a toi aussi Cyrano !!!!!!

Code : Tout sélectionner

SELECT f.BA, f.vendeur, t1.ACCEPTES,t2.REFUSES FROM (finance f LEFT JOIN ( SELECT finance.BA, finance.vendeur, Count(finance.BA) AS ACCEPTES FROM finance WHERE finance.NumCarte Not IN (SELECT * FROM ACTIVITE) AND finance.NumAuto Not IN (SELECT * FROM AUTO) GROUP BY finance.BA, finance.vendeur ) AS t1 on (t1.vendeur=f.vendeur) ) LEFT JOIN ( SELECT finance.BA, finance.vendeur, Count(finance.BA) AS REFUSES FROM finance WHERE finance.NumAuto IN (SELECT * FROM AUTO) GROUP BY finance.BA, finance.vendeur ) AS t2 on (t2.vendeur=f.vendeur) GROUP BY f.BA, f.vendeur,t1.ACCEPTES,t2.REFUSES ;
je file essayer ca au boulot !! voir si ca fonctionne réellement sur les gros fichiers !!!!!
:love5: :love5: :love5: :love5: :love5: :love5: :love5: :love5:

par TOMITOMAS » 14 mars 2006, 15:29

autant pour moi !!!
je pensais que c'était une petite blague de plus !!! :) :P

il ne reconnait pas la fx COALESCE ?!
le 'USING' il n'aime pas ca non plus ('synthaxe erreur'), je les remplacer par le 'ON' (pas de pb de synthaxe)

par Hubert Roksor » 14 mars 2006, 15:25

Ah, ben non, ça ne fonctionnera probablement pas parce que je crois comprendre que finance.vendeur n'est pas unique. Essaie toujours avec un GROUP BY vendeur, BA ou une autre combinaison correspondant à la structure de ta base.

Bonne chance.

par Hubert Roksor » 14 mars 2006, 15:17

ce n'est pas un attribut (pas la peine de me citer, j'ai vu l'erreur :) ) c'est une occurence des autres tables. 'AUTO' et 'ACTIVITE', et ca par contre je ne peux pas les supprimer [...]
Euh, c'était une question authentique, je n'ai pas compris vraiment compris le contenu (sans parler de la relation) de ces tables.

Mais si tes requêtes précédentes marchent, alors essaie peut-être ça:

Code : Tout sélectionner

SELECT f.BA, f.vendeur, COALESCE(t1.ACCEPTES, 0) AS ACCEPTES, COALESCE(t2.REFUSES, 0) AS REFUSES FROM (finance f LEFT JOIN ( SELECT finance.BA, finance.vendeur, Count(finance.BA) AS ACCEPTES FROM finance WHERE finance.date = Date() AND finance.NumCarte Not IN (SELECT * FROM ACTIVITE) AND finance.NumAuto Not IN (SELECT * FROM AUTO) GROUP BY finance.BA, finance.vendeur, finance.date ) AS t1 USING (BA, vendeur) ) LEFT JOIN ( SELECT finance.BA, finance.vendeur, Count(finance.BA) AS REFUSES FROM finance WHERE finance.date = Date() AND finance.NumAuto IN (SELECT * FROM AUTO) GROUP BY finance.BA, finance.vendeur, finance.date ) AS t2 USING (BA, vendeur)

par TOMITOMAS » 14 mars 2006, 15:11

bonne petites blagues !! :D ca me fait sourire !!
en faite ca fonctionne ! mais pas comme je le souhaiterai.... pcq les résultats je les ai mais avec deux requetes différentes, donc avec deux tableaux résultats.
le but de la requete que je cherche, c'est de ne plus en avoir qu'un seul !!!
(-> mais sinon ca fonctionne, donc ils s'y adaptent pas trop mal :) )

alors ce n'est pas un attribut (pas la peine de me citer, j'ai vu l'erreur :) ) c'est une occurence des autres tables. 'AUTO' et 'ACTIVITE', et ca par contre je ne peux pas les supprimer parce qu'on en a besoin pour tout ce qui est de la gestion apres (mais la ca devient long et compliqué à expliquer)

par Hubert Roksor » 14 mars 2006, 15:01

Et sinon, ils s'adaptent bien au fait que ça ne fonctionne pas ? :lol:

Blague à part, (quoique...) je ne comprends pas pourquoi NumAuto et NumCarte peuvent être soit des numéros soit des attributs, et si tu pouvais "normaliser" la chose ce serait sûrement une épine de moins dans ton pied. Tu n'as pas envie de remplacer un système bancal par un autre système bancal. Au fait... c'est quoi un attribut ?

par TOMITOMAS » 14 mars 2006, 14:48

non non je peux modifier la base. et il n'y a pas d'autre logiciel qui s'en sert. tout passe seulement par access (saisi, stat, ....) je n'ai pas d'interface ni rien.
cependant comme je l'expliquais a Cyrano, mes collegues ont deja du mal a sy adapter, alors que les informations qui sont demandées sont les même que ce qu'ils faisaient avant. donc je me vois mal, rajouter une colonne avec un booléen pour définir le statut d'un dossier :s

par Hubert Roksor » 14 mars 2006, 14:38

Est-ce que tu peux la modifier c'est le boulot de quelqu'un d'autre, ou la base est utilisé par un autre logiciel que tu ne contrôles pas.

par TOMITOMAS » 14 mars 2006, 14:35

qu'appelles tu 'controler la structure de la base' ??

par Hubert Roksor » 14 mars 2006, 14:30

Au fait, j'ai oublié de te demander si tu contrôlais la structure de la base ? Parce que je pense que tes problèmes de requêtes pourrait être plus facilement résolu si tu changeais certaines choses.

PS: toute ma sympathie pour l'ami Cyrano qui doit s'arracher les cheveux en essayant de debugger du Access à distance :lol: