Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Wed 23 January 2008 18:27

laureN
Participant actif
Date d'inscription: 23 Nov 2007
Messages: 105

Pb de requête

Bonjour,

Je fait des tests pour vérifier le SQL utilisé dans MI, et j'aimerais savoir comment il est possible de stocker le resultat d'une requête dans une variable utilisable dans une autre requête?  en effet pour pas mal de mes requêtes je n'ai pas d'erreur d'sql mais le résultat retourné est faux, je fais pour l'instant des tests sur de petites tables faciles à vérifier mais sur les grosses ça ne sera pas facile....

Regardez la pièce attachée, sur les tables fournies par MI 8.5, si j'utilise fde06 et fre06 pour avoir en retour les "départements dont le revenu est minimun pour un ensemble de régions donné",j'obtient une réponse fausse......


Si quelqu'un peux jeter un oeil, Merci d'avance


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#2 Wed 23 January 2008 20:47

Maurice
Membre
Lieu: Montpellier
Date d'inscription: 5 Sep 2005
Messages: 5331

Re: Pb de requête

laureN a écrit:

...pour avoir les "départements dont le revenu est minimum pour un ensemble de régions donné", j'obtiens une réponse fausse....


Bonjour
C'est parce que la requête est fausse (par rapport au résultat souhaité) smile  Il faut une sous-sélection
Une première hypothèse

Select fde06.Nom, fde06.Menages, fre06.Nom from fde06, fre06 where fde06.CodeReg= fre06.Code And fde06.Menages = any (select Min(Menages) from fde06 where CodeReg in ("11","24"))


Seconde solution, puisqu'il y a une colonne fde06.CodeReg

Select Nom, Menages, CodeReg from fde06 where Menages = any (select Min(Menages) from fde06 where CodeReg in ("11","24"))

Hors ligne

 

#3 Wed 23 January 2008 23:00

laureN
Participant actif
Date d'inscription: 23 Nov 2007
Messages: 105

Re: Pb de requête

bonjour,


j'ai testé les requêtes proposées (j'avais déjà tenté ces options) et c'est faux cela ne sort que le département ayant la plus petite valeur de ménage de l'ensemble des deux régions (soit l'indre) et non pas les départements ayant les valeurs de ménages les plus faibles de chacune des valeurs c'est à dire l'indre (reg24) et le val d'oise (reg 11). c'est pourquoi je pense à la programmation....


Si quelqu'un trouve........


Merci

Hors ligne

 

#4 Wed 23 January 2008 23:53

Maurice
Membre
Lieu: Montpellier
Date d'inscription: 5 Sep 2005
Messages: 5331

Re: Pb de requête

Donc c'est que l'énoncé n'est pas:

...pour avoir les "départements dont le revenu est minimum pour un ensemble de régions donné"...


mais plutôt:

...pour avoir les "départements dont le revenu est minimum pour chacune des régions d'un ensemble de régions donné..."


Alors, en rajoutant un Group By, on devrait arriver au résultat avec:

Select fde06.Nom, Min(fde06.Menages), fre06.Nom from fde06, fre06 where fde06.CodeReg= fre06.Code And fde06.Nom = any (select Nom from fde06 where CodeReg in ("11","24")) group by fde06.Nom


nb: la table obtenue est non graphique, à cause du Group By

Hors ligne

 

#5 Thu 24 January 2008 10:01

laureN
Participant actif
Date d'inscription: 23 Nov 2007
Messages: 105

Re: Pb de requête

Bonjour,

Merci pour ta réponse mais cela ne marche pas j'ai mis une capture d'écran avec la requete et la table de résultante....


C'est pas si simple


PS: j'ai testé sous MySql une requête qui marche mais elle n'est pas rigoureuse niveau SQL mais MysQL l'accepte et retourne le bon résultat, impossible de la transcrire sur MI ce qui niveau sql est logique



SELECT Fre06.nom, min(Fde06.menages), Fde06.nom from Fre06,Fde06 where Fre06.code = Fde06.codereg and Fde06.menages=(select min(Fde06.menages) from Fde06 where Fde06.codereg=Fre06.code) and Fde06.codereg in ("11","13") group by Fde06.codereg

Dernière modification par laureN (Thu 24 January 2008 10:02)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#6 Thu 24 January 2008 10:30

Maurice
Membre
Lieu: Montpellier
Date d'inscription: 5 Sep 2005
Messages: 5331

Re: Pb de requête

Essaie juste avec la dernière requête que j'ai posté en changeant group by fde06.Nom pargroup by fde06.CodeReg

Hors ligne

 

#7 Thu 24 January 2008 10:46

laureN
Participant actif
Date d'inscription: 23 Nov 2007
Messages: 105

Re: Pb de requête

Alors si on fait ce changement il sort des résutats faux, j'ai mis en pièce attachée le résultat, en fait j'ai le bon nom des région, j'ai bien la valeur du champ ménage minimum de chaque région mais le nom des départements est faux, l'intégrité des données n'est pas respectée, la valeur du champs ménage ne correspond pas à son nom de département dans la table résultante.....


Heureusement que ces tables sont petites et qu'une erreur est vite vu ....... ce qui est inquiétant c'est que la logique SQL est là mais MI l'interprète mal et surtout sort des résultats faux ça serait mieux qu'il donne une erreur, j'ai peur que certains ai utilisé ce genre de requêtes sans voir l'erreur.....c'est vrai que sur de grosses tables c'est pas évident......

Dernière modification par laureN (Thu 24 January 2008 10:59)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#8 Thu 24 January 2008 11:51

Maurice
Membre
Lieu: Montpellier
Date d'inscription: 5 Sep 2005
Messages: 5331

Re: Pb de requête

Désolé, j'avais du mal à juger n'ayant pas les tables fde06 et fre06 que tu utilises
Mais effectivement cela va être coton à obtenir puisque la fonction Min() s'applique à toute une colonne et que pour avoir le résultat souhaité il faudrait l'appliquer successivement à un sous ensemble puis à l'autre...
Etant en grève ce jour (smile)...je vais tâcher de réfléchir à une requête unique (ou s'il le faut, décomposer en plusieurs requêtes)

Hors ligne

 

#9 Thu 24 January 2008 12:03

laureN
Participant actif
Date d'inscription: 23 Nov 2007
Messages: 105

Re: Pb de requête

Merci beaucoup, ui c'est coton c'est pour ça que je pensais à de la programmation comme on le fait entre le php et mySQL par exemple mais je ne sais pas comment faire avec le MapBasic, le problème c'est que Map info n'a pas la clause Having .....

Decomposer en deux implique de faire une première requête qui prendra les département d'une région donnée, enfaire une table  et puis dedans prendre le min par une autre requete, mais c'est impensable d'avoir autant de table que de régions.....c'est pas du tout efficasse


Merci de ton aide et si un autre internaute s'interesse à la question merci de sa future collaboration


PS: je vais contacter le service technique de MI si personne ne trouve

Sous Mysql voici une requête propre qui marche bien mais impossible à passer sous MI qui n'accepte qu'une sous requête


SELECT Fre06.nom, Fde06.menages, Fde06.nom
FROM Fre06, Fde06
WHERE Fre06.code = Fde06.codereg
AND (
Fde06.menages = (
SELECT min( Fde06.menages )
FROM Fde06
WHERE Fde06.codereg =11 )
OR Fde06.menages = (
SELECT min( Fde06.menages )
FROM Fde06
WHERE Fde06.codereg =13 )
)


Il faudrait pouvoir stocker sous MI.....

Dernière modification par laureN (Thu 24 January 2008 12:55)

Hors ligne

 

#10 Thu 24 January 2008 13:31

Maurice
Membre
Lieu: Montpellier
Date d'inscription: 5 Sep 2005
Messages: 5331

Re: Pb de requête

Pour l'instant en trois étapes, la troisième pouvant être réutilisée en changeant seulement le code des régions:

Select Min(Menages) "minimum", NomReg,CodeReg from fde06 group by NomReg into minimas
Select Nom,Menages,NomReg,CodeReg from fde06 where Menages=any (select minimum from minimas) into result1
Select * from result1 where CodeReg in ("11","24") into FINAL


Je tâcherai de réduire après la manif... tongue

Pardon, c'était évident !! En deux:

Select Min(Menages) "minimum", NomReg,CodeReg from fde06 group by NomReg into minimas
Select Nom,Menages,NomReg from fde06 where Menages=any (select minimum from minimas) and CodeReg in ("11","24") into resultat


... pas mieux smile

Hors ligne

 

#11 Thu 24 January 2008 13:46

laureN
Participant actif
Date d'inscription: 23 Nov 2007
Messages: 105

Re: Pb de requête

Merci beaucoup et bonne manif à toi. Je vais tester , on verra bien si d'autres trouvent mieux...
J'ai testé ça marche en rajoutant la condition de jointure entre les deux tables fde06 et fre06 pour jouer avec le nom des régions mais la méthode est là.

C'est donc irréalisable en une seule requete mais si l'assistance technique de MI me donne une solution je la mettrais sur le forum

Dernière modification par laureN (Thu 24 January 2008 15:30)

Hors ligne

 

Pied de page des forums

Powered by FluxBB