Page 1 sur 1

Somme de certaines colonnes dans un tableau

Posté : 19 mai 2016, 09:56
par marcq
Bonjour,

J'ai créé une requête (voir en bas de page), afin de pouvoir afficher dans un template PDF les valeurs d'un tableau.

La requête ci-dessous affiche/regroupe bien les catégories (Boisson, Divers, Vin), mais ne calcule pas la somme des articles et des prix TTC :

Code : Tout sélectionner

À facturer Boisson | 10 | 25.00 | Divers | 20 | 112.00 | Vin | 2 | 20.20 |
J'ai effectivement deux records de la catégorie Boisson dans la BDD :

Code : Tout sélectionner

Boisson | 10 | 25.00 | Boisson | 10 | 25.00 |
Le résultat de la catégorie Boisson devrait donc être :

Code : Tout sélectionner

À facturer Boisson | 20 | 50.00 | Divers | 20 | 112.00 | Vin | 2 | 20.20 |
Je souhaiterais donc faire la somme des articles (fab_booking_44_repeat.nombre_art) et du prix TTC (fab_booking_44_repeat.prix_ttc).

J'ai essayé différentes variantes telles que :

Code : Tout sélectionner

array('fab_booking.id', 'fab_catering_categories.categories', 'SUM(fab_booking_44_repeat.nombre_art)', 'SUM(fab_booking_44_repeat.prix_ttc)')) ou encore array('fab_booking.id', 'fab_catering_categories.categories', SUM('fab_booking_44_repeat.nombre_art'), SUM('fab_booking_44_repeat.prix_ttc')))
mais sans succès.

La solution doit être triviale, mais étant encore un débutant, cela dépasse mes capacités actuelles.

Merci d'avance pour vos suggestions et conseils.

Marc

Requête

Code : Tout sélectionner

$bookingid = JRequest::getVar('rowid'); $db = JFactory::getDbo(); $query = $db->getQuery(true); $query ->select (array('fab_booking.id', 'fab_catering_categories.categories', 'fab_booking_44_repeat.nombre_art', 'fab_booking_44_repeat.prix_ttc')) ->from('fab_booking') ->leftJoin('fab_booking_44_repeat ON fab_booking.id = fab_booking_44_repeat.parent_id') ->leftJoin('fab_catering_categories ON fab_booking_44_repeat.categorie = fab_catering_categories.id') ->having('fab_booking.id = ' . $db->quote($bookingid)) ->group('fab_catering_categories.categories'); $db->setQuery($query); $row = $db->loadObjectList(); echo "<div style='font-family: arial, helvetica, sans-serif; font-size: 11pt;'>"; foreach ($row as $item) { echo "$item->categories | "; echo "$item->nombre_art | "; echo "$item->prix_ttc | <br />"; echo ""; } echo "</div>";

Re: Somme de certaines colonnes dans un tableau

Posté : 19 mai 2016, 12:42
par Saian
Salut, si tu veux et la liste des articles et leur somme, tu dois soit faire 2 requêtes, l'actuelle pour la liste et une autre pour les totaux (avec une requête du genre select count(id) as count, sum(prix) as prix_total à adapter selon les colonnes, avec count pour compter le nombre d'éléments et sum pour faire la somme des valeurs).
Soit tu peux calculer les totaux à l'aide de la boucle en initialisant les variables nécessaires avant la boucle et en les incrémentant dans la boucle. Tu obtiendras ainsi les totaux en sortie de boucle.

Re: Somme de certaines colonnes dans un tableau

Posté : 19 mai 2016, 16:52
par Ryle
Bonjour,

Pas besoin de deux requêtes, une seule requête avec un SUM() sur tes prix et quantité et un GROUP BY pour regrouper le tout par catégorie (id & libellé) devrait fonctionner :)

Je ne connais pas la librairie JFactory que tu utilises pour faire ta requête, ni ce qu'elle apporte, mais ça m'a l'air drôlement compliqué pour faire un simple select... en version SQL il faudrait simplement exécuter :
SELECT fab_booking.id, fab_catering_categories.categories, SUM(fab_booking_44_repeat.nombre_art), SUM(fab_booking_44_repeat.prix_ttc)   
FROM fab_booking
LEFT JOIN fab_booking_44_repeat ON fab_booking.id = fab_booking_44_repeat.parent_id
LEFT JOIN fab_catering_categories ON fab_booking_44_repeat.categorie = fab_catering_categories.id
WHERE fab_booking.id = ??
GROUP BY fab_booking.id, fab_catering_categories.categories
A noter que la jointure avec la table fab_booking n'est même pas nécessaire puisque ton id booking est une constante soumise dans le WHERE...
SELECT fab_booking_44_repeat.parent_id, fab_catering_categories.categories, SUM(fab_booking_44_repeat.nombre_art), SUM(fab_booking_44_repeat.prix_ttc)   
FROM fab_booking_44_repeat 
LEFT JOIN fab_catering_categories ON fab_booking_44_repeat.categorie = fab_catering_categories.id
WHERE fab_booking_44_repeat.parent_id = ??
GROUP BY fab_booking_44_repeat.parent_id, fab_catering_categories.categories
Edit : Et avec quelques alias pour faciliter la lecture...
SELECT rep.parent_id, cat.categories, SUM(rep.nombre_art), SUM(rep.prix_ttc)   
FROM fab_booking_44_repeat rep
LEFT JOIN fab_catering_categories cat ON rep.categorie = cat.id
WHERE rep.parent_id = ??
GROUP BY rep.parent_id, cat.categories

Re: Somme de certaines colonnes dans un tableau

Posté : 19 mai 2016, 17:04
par Saian
Autant pour moi, je n'avais pas lu assez attentivement et comme tes lignes sont des regroupements d'articles (et non des articles, ce que j'avais malencontreusement supposé ^^) Ryle a tout à fait raison. :)

Bref, mal lu mal répondu, désolé si je t'ai lancé dans une fausse piste.

Re: Somme de certaines colonnes dans un tableau

Posté : 20 mai 2016, 04:54
par marcq
Autant pour moi, je n'avais pas lu assez attentivement et comme tes lignes sont des regroupements d'articles (et non des articles, ce que j'avais malencontreusement supposé ^^) Ryle a tout à fait raison. :)

Bref, mal lu mal répondu, désolé si je t'ai lancé dans une fausse piste.
Bonjour, pas de souci, merci d'avoir pris le temps de me lire et de me proposer une solution !

Re: Somme de certaines colonnes dans un tableau

Posté : 20 mai 2016, 08:48
par marcq
Bonjour Ryle,

Merci pour ton retour et les propositions qui sont les bienvenues !

En fait, j'utilise Jdatabase https://docs.joomla.org/Selecting_data_ ... atabase/fr de joomla pour créer mes requêtes et ainsi respecter les "standards". Mais la doc est incomplète. j'aimerais dans la mesure du possible respecter ces conventions.

La requête en SQL que tu as proposée fonctionne bien sûr, j'utilisai jusqu'à présent des requêtes SQL, mais souhaitant assurer la comptabilité avec des extensions Joomla (comme par exemple fabrik), j'ai décidé de toutes les réécrire.

J'ai posté un thread sur un forum Joomla, je pense que c'est plus judicieux.

Merci à nouveau pour ton aide.

Marc

Re: Somme de certaines colonnes dans un tableau

Posté : 20 mai 2016, 12:16
par marcq
La solution :

Code : Tout sélectionner

->select (array('fab_booking.id', 'fab_catering_categories.categories', 'sum(fab_booking_44_repeat.nombre_art) as nombre_art', 'sum(fab_booking_44_repeat.prix_ttc) as prix_ttc'))

Re: [RESOLU] Somme de certaines colonnes dans un tableau

Posté : 20 mai 2016, 17:43
par Ryle
Bonjour,

C'était donc l'alias qui te manquait ?

C'est tout à ton honneur que d'utiliser Jdatabase (que je ne connais pas) et de respecter le standard joomla. Pour autant - et ça n'engage que moi - ça me parait quand même ajouter un niveau de complexité élevé pour faire du SQL, qui est au départ un langage ultra simple :)

Alors certes, il peut y avoir des spécificités propres à certaines bases de données, mais c'est devenu assez rare ou porte sur des sujets suffisamment complexe dont je doute que jdatabase y apporte des solutions de portabilité. Quoi qu'il en soit, la meilleure façon de faire reste celle qui vous convient :)