cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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
pcarme
Messages postés2Date d'inscriptionsamedi 1 mai 2004StatutMembreDernière intervention16 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??
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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
Zlub
Messages postés809Date d'inscriptionmercredi 11 octobre 2000StatutMembreDernière intervention29 septembre 20108 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.