agrégation sur valeur

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 : agrégation sur valeur

par furiouslol » 26 avr. 2009, 11:43

Ha !! trouvé !!

http://www.phpfrance.com/forums/voir_su ... te-max.php

Donc l'utilisation du MAX dans un HAVING comme cet exemple devrait te convenir

par furiouslol » 26 avr. 2009, 11:34

Salut

Je pense que ton MIN(priorite), et ton tmp_pierre.com_type. je veux dire rien ne t'assure de récupérer le tmp_pierre.com_type en rapport avec ton MIN(priorite).

Y a eu un post ou on a parlé de ca mais je ne me souviens plus de la solution :oops:

par pierreC » 24 avr. 2009, 18:42

arff j'ai pourtant fait attention en extrayant un bout de mon projet vers le forum, mais je suis passé à coté de cette erreur.

J'ai modifié donc dans l'énoncé type devient com_type,

Et le problème est le même et la question subsite donc encore ...

par GiorgioLino » 24 avr. 2009, 16:09

Suggestion : Tu demandes le champ 'com_type' dans la table tmp_pierre alors qu' a priori ce serait plutôt 'type'.

Code : Tout sélectionner

SELECT cl_id,min(priorite) as num_type, tmp_pierre.com_type <- ICI FROM tmp_pierre LEFT JOIN dico_priorite_com_type ON dico_priorite_com_type.com_type= tmp_pierre.com_type <-- ICI AUSSI GROUP BY cl_id;


Je penses que l'erreur vient de là.

par pierreC » 24 avr. 2009, 15:29

Hello,

je fait remonter ce messages car après qqjours de prod je viens de me rendre compte d'un pb

en effet j'ai comme donée de départ une table tmp_pierre
com_type cl_id

abo 1
mix 1
vpc 1
abo 2
mix 2
vpc 3
mix 3
vpc 4
abo 4
vpc 5
selon une table dico_priorite_com_type qui contient :
com_type priorite
mix 10
abo 20
vpc 30
ce qui doit me donner comme résultat : (regroupement sur cl_id avec selection de la plus petite priorité)
com_type cl_id

mix 1
mix 2
mix 3
abo 4
vpc 5


J'ai donc écrit cette requete :
SELECT cl_id,min(priorite) as num_type,tmp_pierre.com_type FROM tmp_pierre LEFT JOIN dico_priorite_com_type ON dico_priorite_com_type.com_type=tmp_pierre.com_type GROUP BY cl_id;
Ce qui me donne ce mauvais résultat :
+-------+----------+----------+
| cl_id | num_type | com_type |
+-------+----------+----------+
| 1 | 10 | abo |
| 2 | 10 | abo |
| 3 | 10 | vpc |
| 4 | 20 | vpc |
| 5 | 30 | vpc |
+-------+----------+----------+
les champs cl_id et num_type sont, pas contre je ne sais pas d'où est ce qu'il me sort le com_type ?


des idées ?


Merci

par furiouslol » 31 mars 2009, 10:21

Exact :wink:

par pierreC » 31 mars 2009, 09:37

je pense avoir trouvé une solution je vais créer une table des priorités pour type_achat
autre 10
vpc 20
abo 30
avec une jointure et un max sur type_achat sa devrait le faire.

par furiouslol » 31 mars 2009, 08:20

Enfin si c'est ordonnable mais de façon alphabétique, ce qui n'est pas ce que tu veux ... Si tu veux faire des requêtes par rapport a un ordre il faut que cet ordre soit présent quelque part dans ta base ... Si ce n'est pas le cas, traite le en php :)

par furiouslol » 31 mars 2009, 08:18

Salut,

La solution serait bien dans les ORDER BY mais si tu as des strings dans ton champ ce n'est surement pas ordonnable

agrégation sur valeur

par pierreC » 30 mars 2009, 16:28

Hello,

Si le titre etait facile à écrire la recherche google le serait aussi. Je viens donc ici poser ma question.

j'ai une table de commandes avec 3 colonnes, id_cl, date, type_achat.
J'ai besoin d'effectuer une requete qui me retournera les clients de maniere unique selon 2 critères et un regroupement.

Raisonnement etape par etape :
Regroupement d'bord sur l'id_cl, avec une agrégation sur max(date). Jusque là c'est pas dure la requete est :
SELECT id_cl,max(date) FROM commande GROUP BY id_cl
Mais je peut avoir 2 dates identique, type_achat entre donc en compte. Je dois choisir parmis 3 type_achat avec comme ordre de priorité : abo, vpc, autre

exemple avec ces données :
1 2009-08-10 abo
1 2009-08-12 vpc
1 2009-08-12 abo
1 2009-08-12 autre
Ceci ne devra me renvoyer une ligne :
1 2009-08-12 abo
Y a t'il dans mysql une fonction d'agration sur une priorité dans une liste de valeur ?

Ou bien une logique tout autre pour arriver au meme résultat ?


Merci