requête - group by

Eléphanteau du PHP | 40 Messages

26 mars 2007, 12:00

Bonjour,

De la table des commandes effectuées, je peux sans difficulté extraire les données pour afficher un tableau récapitulatif des commandes par genre,
et pour chaque genre la quantité d’articles commandés, la somme correspondante, etc.

genre1 | qte | somme
genre2 | qte | somme
genre3 | qte | somme
...

Code : Tout sélectionner

$sql = "SELECT “. “COUNT(id) AS qte, SUM(prix) AS prix, SUM(tva) AS tva, genre". "FROM commandes ". "GROUP BY genre";
Seulement, là où je coince, c’est pour affiner mes résultats.
A chaque commande est associé un lieu de livraison.

J’aimerais que mon tableau récapitulatif affiche séparément, en colonnes, les quantités, sommes, etc. en fonction de chaque lieu :

genre1 | qte lieu1 | somme lieu1 | qte lieu2 | somme lieu2
genre2 | qte lieu1 | somme lieu1 | qte lieu2 | somme lieu2
genre3 | qte lieu1 | somme lieu1 | qte lieu2 | somme lieu2
…..

Y a-t-il une solution pour effectuer cela en une seule requête ?
Ou faut-il obligatoirement le faire séparément ?

Merci de votre aide.
cb

ViPHP
pjl
ViPHP | 2119 Messages

26 mars 2007, 13:26

Tu parles de lieu de livraison et cette notion n'apparait pas dans la requête, cest normal ?


PS : a quoi ca sert de concaténer la requête ? Ne peux-tu pas l'écrire en une seule ligne ?

Eléphanteau du PHP | 20 Messages

26 mars 2007, 14:22

Tu peux essayer un GROUP BY WITH ROLLUP.

Code : Tout sélectionner

SELECT genre, lieu, COUNT(id), SUM(prix) FROM commandes GROUP BY genre, lieu WITH ROLLUP;
A partir d'une table commandes comme ceci :

Code : Tout sélectionner

SELECT * FROM commandes; +----+---------+-------+-------+ | id | prix | genre | lieu | +----+---------+-------+-------+ | 1 | 100.00 | 1 | lieu1 | | 2 | 150.00 | 1 | lieu1 | | 3 | 200.00 | 2 | lieu1 | | 4 | 250.00 | 2 | lieu1 | | 5 | 1000.00 | 1 | lieu2 | | 6 | 1500.00 | 1 | lieu2 | | 7 | 2000.00 | 2 | lieu2 | | 8 | 2500.00 | 2 | lieu2 | +----+---------+-------+-------+
te renvoie comme résultat:

Code : Tout sélectionner

+-------+-------+-----------+-----------+ | genre | lieu | COUNT(id) | SUM(prix) | +-------+-------+-----------+-----------+ | 1 | lieu1 | 2 | 250.00 | | 1 | lieu2 | 2 | 2500.00 | | 1 | NULL | 4 | 2750.00 | | 2 | lieu1 | 2 | 450.00 | | 2 | lieu2 | 2 | 4500.00 | | 2 | NULL | 4 | 4950.00 | | NULL | NULL | 8 | 7700.00 | +-------+-------+-----------+-----------+
Tu as bien le détail par genre et lieu (sur plusieurs lignes).

A toi de voir.
Un NULL dans une colonne indique un résumé.
Pierre Dumont
Formateur Linux / MySQL
http://www.anaska.com
Tel : 01 45 28 09 82 / Fax : 01 45 28 72 39

Eléphanteau du PHP | 40 Messages

28 mars 2007, 14:15

Merci pour vos répones.

GROUP BY WITH ROLLUP :
je vais regarder cela de près.

Ben non, le lieu de livraison ne figure pas dans la première requête citée puisque celle-ci n'en tient pas compte...

Pour la concaténation, oui bien sûr qu'elle tient en une ligne. Le problème n'est pas là.

cb