group by, count, et condition

Eléphant du PHP | 74 Messages

06 avr. 2009, 12:01

hello,

Encore un titre bien pourrit pour une requete bien tordu :-)

un exemple valant mieux qu'un long discours voici l'exemple

id_client , titre
35 , ABO
42 , CPT
42 , ABO
56 ,
56 , CPT
78 , VPC
qui doit donnée le resultat
id_client , titre
35 , ABO
42 , MLT
56 , CPT
78 , VPC
Algo :
Regroupement sur id_client, si un client à plusieurs titre, alors titre vaut MLT (comme multi) sinon vaut la valeur du titre.

L'algo est simple, mais pour le traduire en SQL :roll:


Une idée ?

Merci
Mon projet opensource de gestion de Devis, Commandes, Factures, pour TPE : OpenDCF : http://opendcf.1g6.biz

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

06 avr. 2009, 12:25

A mon avis, tu auras plus vite fait de faire une requête simple et de traiter le résultat ensuite avec ton code.... Parce que rajouter des case/when dans ta requête pour savoir si un id_client est présent plusieurs fois et avec une valeur unique ou null, ou alors présent avec plusieurs valeurs distincte et dans ce cas renseigner par "MLT" ... si toutefois tu y arrives, ça va sérieusement alourdir ton traitement pour pas grand chose :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 74 Messages

06 avr. 2009, 13:15

Quand mon analyse arrive au même résultat qu'un modo php, ca me rassure assez dans mes choix technique :lol:

je vais peut-etre etre modo un jour 8-)


Donc sql + php en réponse à ce problème ca m'ira très bien.
Mon projet opensource de gestion de Devis, Commandes, Factures, pour TPE : OpenDCF : http://opendcf.1g6.biz

Eléphant du PHP | 111 Messages

06 avr. 2009, 15:17

et avec un

Code : Tout sélectionner

SELECT MAX(ID_CLIENT), DISTINCT(NOM_CLIENT) FROM CLIENTS GROUP BY ID_CLIENT, NOM_CLIENT;
Ca fonctionne pas ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

06 avr. 2009, 17:05

Ce n'est pas la même chose :)

Dans ta requête, tu vas chercher l'id max pour chaque client. Cela va te retourner les infos suivantes :

Code : Tout sélectionner

ABO , 42 CPT , 56 VPC , 78 , 56
(à noter d'ailleurs que "id_client" ne devrait pas figurer dans ton GROUP BY, puisque ta colonne est déja aggrégée par le max() :))

Il te manque ici les notions :
- "s'il y a plusieurs clients différents et non null pour un même id, je spécifies la valeur 'MLT'
- "s'il y a plusieurs clients mais un seul non null, j'utilises le non null
Qui vont être particulièrement galère à implémenter en sql dans la mesure où il faut jongler avec des tests de quantité et de définition, alors qu'une boucle php produira le même résultat en quelques lignes et sans prise de tête ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...