Probleme select...max

pcarme Messages postés 2 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 16 septembre 2010 - 16 sept. 2010 à 10:28
Zlub Messages postés 809 Date d'inscription mercredi 11 octobre 2000 Statut Membre Dernière intervention 29 septembre 2010 - 28 sept. 2010 à 23:47
Bonjour,
je dispose d'une table contenant les champs suivants :
N°_societe
N°_INSEE
N°_ilot
surface
produit

La requete suivante fonctionne et me donne la surface max par ilot tout en affichant la société.

SELECT N°_societe, N°_ilot, MAX(SURFACE) AS [surface max]
FROM ma_table
GROUP BY N°_societe, N°_ilot;

Je souhaite maintenant, afficher en plus le N°insee et le produit associé à cette surface max par ilot.

Et là, blocage, je n'y arrive pas (mon SQL commence à être sérieusement rouillé ).
Merci pour votre aide...

4 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
16 sept. 2010 à 11:14
Salut,

Si ton produit et ton numéro insee sont uniques dans ton groupe, alors ajoute les dans ta clause group by, sinon, tu ne pourras pas faire de select dessus : il n'est pas possible de faire un select d'un champ qui n'est pas contenu dans la clause GROUP BY et qui n'a pas une fonction d'agrégat, par exemple :

SELECT NOM, PRENOM, SUM(AGE) FROM Personne GROUP BY NOM

Ca ne passera pas, car tu peux avoir plusieurs personnes de même nom mais avec des prénoms différents !

Alors que :
SELECT NOM, PRENOM, SUM(AGE) FROM Personne GROUP BY NOM, PRENOM

Ca passera, mais le groupe sera différent.
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0
pcarme Messages postés 2 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 16 septembre 2010
16 sept. 2010 à 13:29
Merci pour ta réponse,
le problème est que :
- 1 société peux être présente sur plusieurs N°_insee, et qu'un même N°_ilot peut avoir plusieurs produits....(elle est dure la vie...)

Aussi, ne serait-il pas possible d'agir en 2 temps :
1/ exécuter ma 1ere requête et stocker le résultat dans une table (tout en recopiant
le N° d'indexation [numeroauto] des lignes considérées)
2/ faire une requête select dans la table originale du N°_Insee et du produit avec, comme condition "afficher n°_insee et produit si N° d'index des 2 tables est égal"

Si c'est réalisable (et j'aimerai bien, ma table "pèse" 19000 lignes...), comment faire??
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
16 sept. 2010 à 13:41
Salut,

Ce n'est pas aussi simple, comme je te l'ai dit, la clause GROUP BY indique que les lignes sont groupées selon les critiques indiqués, donc, si tu prends la table :

id nom prenom age
1 toto titi 20
2 toto tata 21
3 titi tutu 22

Si tu fais :
SELECT NOM, SUM(AGE) FROM Personne GROUP BY NOM

Ca va te renvoyer :

toto 41
titi 22

mais à partir de cà, tu ne peux pas savoir que les toto en question, c'est les id 1 et 2.

Il faut alors faire une seconde requête pour chaque ligne retournée par ta requête :
SELECT id, Nom FROM TableTemporaire WHERE NOM = "toto"

Et là tu pourra savoir les id correspondant pour chaque ligne, mais si ta première requete te renvoie 10 000 lignes... cela implique que tu fasses 10 000 requetes pour récupérer les id...

Après, il doit être possible de faire cà avec des requêtes imbriquées, et si tu as mis les bons indexes, ca devrait aller relativement vite, du style (à adapter, je suis pas sûr que ca fonctionne) :
SELECT id, Nom, SumAge.Age FROM (SELECT NOM As SumNom, SUM(AGE) AS SumAge FROM Personne GROUP BY NOM) AS SumTable INNER JOIN Personne ON SumTable.NOM = Personne.Nom

______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0
Zlub Messages postés 809 Date d'inscription mercredi 11 octobre 2000 Statut Membre Dernière intervention 29 septembre 2010 8
28 sept. 2010 à 23:47
Salut,

Sur quelle base de données tu travailles ? quelle est la version de ton serveur ?

Existe-t-il plusieurs N°insee par ilot ?
comment connais-tu les produits actuellement sur un ilot ?
Peux-tu donner la structure des tables qui sont à mettre en relation ? tu n'as qu'une table ?
Peux-tu donner un exemple de données que tu stockes ?

Bref, sans ces précision et dans l'absolu, via une requête imbriquée comme l'indique DARKSIDIOUS tu devrais pouvoir obtenir se que tu souhaites.

SELECT id, Nom, SumAge.Age 
FROM (SELECT NOM As SumNom, SUM(AGE) AS SumAge FROM Personne GROUP BY NOM) AS SumTable 
INNER JOIN Personne ON SumTable.NOM = Personne.Nom 


Attention toutes les bases de données n'acceptent pas les requêtes imbriquées. A vérifier que ta base de données et que la version de ton serveur gère cette fonctionnalité.


Sinon autre option serait de passer par une table temporaire que tu peux alimenter via un INSERT INTO SELECT ... puis faire des update dessus.



++

Zlub
0
Rejoignez-nous