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é ?

#1 Thu 27 September 2007 13:53

toulousig
Participant actif
Lieu: Toulouse
Date d'inscription: 5 Sep 2005
Messages: 50

Requête avec Max() et Group By

Bonjour,

J'ai une table qui contient 3 colonnes : "Quartier", "Nb", "Ets".
Je souhaite connaître pour chaque "Quartier" la plus grande valeur de "Nb" et l' "Ets" associé.
Lorsque je fais cette requête :
SELECT max(Nb), Quartier, Ets From MaTable Group By Quartier
j'obtiens bien le plus grand "Nb" par quartier mais la valeur de "Ets" n'est pas celle associée au plus grand "Nb" mais le premier du Quartier (cela vient du Group By).

J'ai fait plusieurs tests de sous requête mais sans succès...
Qqn a-t-il une idée ou a déjà fais ce genre de choses ?

Merci.

Hors ligne

 

#2 Thu 27 September 2007 14:35

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

Re: Requête avec Max() et Group By

Bonjour,
En première analyse je ferai ça en deux étapes par quartier
Select Max(Nb) from MaTable where Quartier="quartier1" into Sel1
Select * from MaTable, Sel1 where MaTable.Nb=Sel1.COL1 into MaxQuartier1
Voir aussi cette discussion
ps: n'oubliez pas de faire une recherche avant de poster smile

Hors ligne

 

#3 Thu 27 September 2007 14:52

toulousig
Participant actif
Lieu: Toulouse
Date d'inscription: 5 Sep 2005
Messages: 50

Re: Requête avec Max() et Group By

Oui, j'ai bien pensé de faire 2 requêtes mais j'ai 60 quartiers... j'aurai donc préféré faire cela en une seule fois, de plus lors des mises à jour de la table je ne recommence pas tout.

ps: j'ai effectué une recherche avant de poster, et j'ai vu cette discussion mais elle ne répond pas à mon pb...

Hors ligne

 

#4 Thu 27 September 2007 14:53

Maestro de la salsa
Participant actif
Date d'inscription: 7 Jun 2006
Messages: 133

Re: Requête avec Max() et Group By

Bonjour,
En deux fois:

1-Requete 1: Select Quartier, max(NB) From matable group by Quartier
2-sauvegarder la requete (req1 avec comme nom de colonne Max(NB)= Col2 par exemple)
3-Select matable.Quartier,matable.NB,matable.Ets from matable,req1 where matable.quartier=req1.quartier and matable.NB=req1.Col2

Il ya peut être plus simple...

Hors ligne

 

#5 Thu 27 September 2007 15:09

toulousig
Participant actif
Lieu: Toulouse
Date d'inscription: 5 Sep 2005
Messages: 50

Re: Requête avec Max() et Group By

Nos messages ont dû se croiser Maestro...
Donc non, je ne préfèrerais pas faire en 2 fois.

Hors ligne

 

#6 Thu 27 September 2007 15:18

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

Re: Requête avec Max() et Group By

Bravo Maestro smile
C'est nickel ... en attendant plus simple (mais je n'y crois pas!!)
L'étape 2 est par contre inutile: MapInfo écrira "tout seul" req1.Col2 quand vous pointerez (dans le requêteur) sur req1.max(NB)

Pour Toulousig: on ne peut pas toujours tout faire d'un coup. Souvent si on y arrive c'est qu'on doit créer (physiquement !!) un Copie_de_MaTable et travailler sur ces 2 tables ...Pas forcément mieux

Hors ligne

 

#7 Thu 27 September 2007 17:01

J. Caba
Juste Inscrit !
Lieu: Auzeville-Tolosan
Date d'inscription: 11 Sep 2006
Messages: 6

Re: Requête avec Max() et Group By

Bonjour, 
Faire quelque chose comme ça :
Select Quartier, nb, ets  from TaTable where Quartier in (select max(nb) from TaTable group by Quartier INTO selection) INTO toto

Je dis ça sans tester, à la "va vite"... (en plus faut considérer le champ Quartier comme sans doublons)

--
Jérôme

Hors ligne

 

#8 Thu 27 September 2007 17:09

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

Re: Requête avec Max() et Group By

Bonjour Jérôme
Ca me surprendrait que MapInfo ne couine pas avec cette syntaxe ... smile

Hors ligne

 

#9 Fri 28 September 2007 09:53

J. Caba
Juste Inscrit !
Lieu: Auzeville-Tolosan
Date d'inscription: 11 Sep 2006
Messages: 6

Re: Requête avec Max() et Group By

Non non, MI ne couine pas mais ma syntaxe est totalement farfelue, je l'admet smile .
Par contre, après vérif, en voici une qui fonctionne :

Code:

Select * from maTable where nb in (select max(nb) from maTable group by quartier) into Selection

C'est testé mais avec un contrainte : il faut qu'un "ets" soit unique dans la table (1ets  1quartier), sinon cette requête n'a bien sûr plus de sens.
Je pense cependant que les solutions proposées (en plusieurs étapes) sont les plus pertinentes et les moins dangereuses.
C'était pour le fun de le faire en une requête smile

--
Jérôme

Hors ligne

 

#10 Fri 28 September 2007 10:59

toulousig
Participant actif
Lieu: Toulouse
Date d'inscription: 5 Sep 2005
Messages: 50

Re: Requête avec Max() et Group By

Malheureusement "ets" n'est pas unique...

Hors ligne

 

Pied de page des forums

Powered by FluxBB