Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème avec GROUP BY

11 réponses
Avatar
Utilisateur1
Bonjour

Soit une vue qui genère une synthèse de chaque commande en fournissant les
champs suivants :
- commande_id
- client_id
- date_livraison
- soustotal_marchandise_horsremise_htva
- remise
- soustotal_marchandise_htva
- frais_de_port_htva

Je cherche à obtenir le total du sous-total htva des marchandises, la
moyenne de la remise et le total des frais de port, pour chaque livraison.
S'il y a plusieurs commandes pour un même client le même jour, on considère
comme étant une seule livraison.

J'avai fait ceci sur postgres :

SELECT date_livraison,
client_id,
COUNT(date_livraison) AS nombre_livraison,
SUM(soustotal_marchandise_htva) AS total_marchandises_htva,
AVG(remise) AS moyenne_remises,
SUM(frais_de_port_htva) AS total_frais_de_port_htva
FROM vue_commande_synthese
GROUP BY date_livraison, client_id;

Mais ca m'affiche quand même 2 livraisons pour deux commandes à la même date
pour le même client...

Ou est l'erreur dans ma logique ?

Merci d'avance !

10 réponses

1 2
Avatar
Ph. B.
Utilisateur1 a demandé:
Bonjour

Soit une vue qui genère une synthèse de chaque commande en fournissant les
champs suivants :
- commande_id
- client_id
- date_livraison
- soustotal_marchandise_horsremise_htva
- remise
- soustotal_marchandise_htva
- frais_de_port_htva

Je cherche à obtenir le total du sous-total htva des marchandises, la
moyenne de la remise et le total des frais de port, pour chaque livraison.
S'il y a plusieurs commandes pour un même client le même jour, on considère
comme étant une seule livraison.

J'avai fait ceci sur postgres :

SELECT date_livraison,
client_id,
COUNT(date_livraison) AS nombre_livraison,
SUM(soustotal_marchandise_htva) AS total_marchandises_htva,
AVG(remise) AS moyenne_remises,
SUM(frais_de_port_htva) AS total_frais_de_port_htva
FROM vue_commande_synthese
GROUP BY date_livraison, client_id;

Mais ca m'affiche quand même 2 livraisons pour deux commandes à la même date
pour le même client...

Ou est l'erreur dans ma logique ?

Merci d'avance !



Bonjour,

La colonne "date_livraison" ne serait-elle pas de type datetime avec la
partie heure différente?

Philippe.
Avatar
Utilisateur1
Bonjour

Merci de votre aide ! Mais le champ date_livraison est un champ de type
"date" qui ne contient pas d'heures.

"Ph. B." a écrit dans le message
de news: 48305443$0$28782$
Utilisateur1 a demandé:
Bonjour

Soit une vue qui genère une synthèse de chaque commande en fournissant
les champs suivants :
- commande_id
- client_id
- date_livraison
- soustotal_marchandise_horsremise_htva
- remise
- soustotal_marchandise_htva
- frais_de_port_htva

Je cherche à obtenir le total du sous-total htva des marchandises, la
moyenne de la remise et le total des frais de port, pour chaque
livraison.
S'il y a plusieurs commandes pour un même client le même jour, on
considère comme étant une seule livraison.

J'avai fait ceci sur postgres :

SELECT date_livraison,
client_id,
COUNT(date_livraison) AS nombre_livraison,
SUM(soustotal_marchandise_htva) AS total_marchandises_htva,
AVG(remise) AS moyenne_remises,
SUM(frais_de_port_htva) AS total_frais_de_port_htva
FROM vue_commande_synthese
GROUP BY date_livraison, client_id;

Mais ca m'affiche quand même 2 livraisons pour deux commandes à la même
date pour le même client...

Ou est l'erreur dans ma logique ?

Merci d'avance !



Bonjour,

La colonne "date_livraison" ne serait-elle pas de type datetime avec la
partie heure différente?

Philippe.
Avatar
Alain Montfranc
Utilisateur1 a écrit
Bonjour

Merci de votre aide ! Mais le champ date_livraison est un champ de type
"date" qui ne contient pas d'heures.



Bizarre... J'avais la meme explication en tete.

Un select distinct date_livraison, client_id

A t'il le meme comportement ?
Avatar
didier gaumet
On Sun, 18 May 2008 17:13:51 +0200, Utilisateur1 wrote:

Bonjour

Soit une vue qui genre une synthse de chaque commande en fournissant les
champs suivants :
- commande_id
- client_id
- date_livraison
- soustotal_marchandise_horsremise_htva
- remise
- soustotal_marchandise_htva
- frais_de_port_htva

Je cherche obtenir le total du sous-total htva des marchandises, la
moyenne de la remise et le total des frais de port, pour chaque livraison.
S'il y a plusieurs commandes pour un mme client le mme jour, on considre
comme tant une seule livraison.

J'avai fait ceci sur postgres :

SELECT date_livraison,
client_id,
COUNT(date_livraison) AS nombre_livraison,
SUM(soustotal_marchandise_htva) AS total_marchandises_htva,
AVG(remise) AS moyenne_remises,
SUM(frais_de_port_htva) AS total_frais_de_port_htva
FROM vue_commande_synthese
GROUP BY date_livraison, client_id;

Mais ca m'affiche quand mme 2 livraisons pour deux commandes la mme date
pour le mme client...

Ou est l'erreur dans ma logique ?

Merci d'avance !



Bonjour,

de mémoire parce que ça fait un bail que je n'ai écrit de SQL, il faudrait
peut-être introduire en supplément une clause ORDER BY similaire à GROUP BY...
Avatar
Utilisateur1
Bonjour

Voici un jeu de test pour mon probleme :

CREATE TEMPORARY TABLE vue_commande_synthese
(
commande_id integer PRIMARY KEY NOT NULL,
client_id INTEGER NOT NULL,
date_livraison DATE,
remise NUMERIC(5,2) NOT NULL,
soustotal_marchandise_htva NUMERIC(9,2),
frais_de_port_htva NUMERIC(9,2)
);

INSERT INTO vue_commande_synthese (commande_id, client_id, date_livraison,
remise, soustotal_marchandise_htva, frais_de_port_htva)
VALUES (1, 1000, TO_DATE('12/05/2008', 'DD/MM/YYYY'), 0, 150, 12.50);

INSERT INTO vue_commande_synthese (commande_id, client_id, date_livraison,
remise, soustotal_marchandise_htva, frais_de_port_htva)
VALUES (2, 1005, TO_DATE('12/05/2008', 'DD/MM/YYYY'), 10, 660, 12.50);

INSERT INTO vue_commande_synthese (commande_id, client_id, date_livraison,
remise, soustotal_marchandise_htva, frais_de_port_htva)
VALUES (3, 1000, TO_DATE('17/05/2008', 'DD/MM/YYYY'), 0, 77.50, 12.50);

INSERT INTO vue_commande_synthese (commande_id, client_id, date_livraison,
remise, soustotal_marchandise_htva, frais_de_port_htva)
VALUES (4, 1005, TO_DATE('14/05/2008', 'DD/MM/YYYY'), 0, 125.75, 12.50);

INSERT INTO vue_commande_synthese (commande_id, client_id, date_livraison,
remise, soustotal_marchandise_htva, frais_de_port_htva)
VALUES (5, 1005, TO_DATE('12/05/2008', 'DD/MM/YYYY'), 0, 339, 12.50);

Et voici ma requete qui ne fonctionne pas (retourne 2 livraisons au lieu de
1 pour le client 1005 au 12/05/2008)

SELECT date_livraison,
client_id,
COUNT(date_livraison) AS nombre_livraison,
SUM(soustotal_marchandise_htva) AS total_marchandises_htva,
AVG(remise) AS moyenne_remises,
SUM(frais_de_port_htva) AS total_frais_de_port_htva
FROM vue_commande_synthese
GROUP BY date_livraison, client_id
ORDER BY date_livraison ASC;

date_livraison | client_id | nombre_livraison | total_marchandises_htva |
moyenne_remises | total_frais_de_port_htva
----------------+-----------+------------------+-------------------------+------------------------+--------------------------
2008-05-12 | 1005 | 2 | 999.00 |
5.0000000000000000 | 25.00
2008-05-12 | 1000 | 1 | 150.00 |
0.00000000000000000000 | 12.50
2008-05-14 | 1005 | 1 | 125.75 |
0.00000000000000000000 | 12.50
2008-05-17 | 1000 | 1 | 77.50 |
0.00000000000000000000 | 12.50
(4 lignes)

Je ne comprend plus rien !

"Ph. B." a écrit dans le message
de news: 48305443$0$28782$
Bonjour,

La colonne "date_livraison" ne serait-elle pas de type datetime avec la
partie heure différente?

Philippe.
Avatar
Jogo
Sur fr.comp.applications.sgbd, Utilisateur1 disait :

Je ne comprend plus rien !



Moi non plus. Le résultat que vous donnez est tout à fait correct.
Quelle réponse attendez-vous ?

--
http://ardus.matabio.net/cgi/liens
Avatar
didier gaumet
Il faut comprendre le fonctionnement de la clause GROUP BY dans ta
requête: elle ne regroupe pas tous les clients, elle regroupe tous les
clients identiques qui se suivent dans l'ordre de lecture. Vu que tu
spécifies un ORDER BY sur la date et non pas sur le couple date+client, le
résultat est conforme à ta requête mais pas à tes attentes...
Avatar
Jerome PAULIN
Utilisateur1 a écrit :

SELECT date_livraison,
client_id,
COUNT(date_livraison) AS nombre_livraison,
SUM(soustotal_marchandise_htva) AS total_marchandises_htva,
AVG(remise) AS moyenne_remises,
SUM(frais_de_port_htva) AS total_frais_de_port_htva
FROM vue_commande_synthese
GROUP BY date_livraison, client_id;





Je ne sais pas si c'est valide sous postgres, mais j'aurai fait quelque
chose du genre :

SELECT date_livraison||client_id as cle,
COUNT(date_livraison) AS nombre_livraison,
SUM(soustotal_marchandise_htva) AS total_marchandises_htva,
AVG(remise) AS moyenne_remises,
SUM(frais_de_port_htva) AS total_frais_de_port_htva
FROM vue_commande_synthese
GROUP BY 1

gg
Avatar
Jogo
Sur fr.comp.applications.sgbd, didier gaumet disait :

Il faut comprendre le fonctionnement de la clause GROUP BY dans ta
requête: elle ne regroupe pas tous les clients, elle regroupe tous les
clients identiques qui se suivent dans l'ordre de lecture.



Non. Elle regroupe toutes les lignes qui ont toutes les colonnes
spécifiées dans la clause GROUP BY identiques. L'ordre n'a aucune
importance et est géré après le GROUP BY.

Bon, je crois avoir compris ce que désire le PO. Est-ce que la
requête suivante donne le résultat escompté ?

SELECT client_id,
COUNT(date_livraison) AS nombre_livraison,
SUM(s_total_marchandises_htva) AS s_total_marchandises_htva,
AVG(s_moyenne_remises) AS s_moyenne_remises,
SUM(s_total_frais_de_port_htva) AS s_total_frais_de_port_htva
FROM ( SELECT date_livraison,
client_id,
SUM(soustotal_marchandise_htva) AS s_total_marchandises_htva,
AVG(remise) AS s_moyenne_remises,
SUM(frais_de_port_htva) AS s_total_frais_de_port_htva
FROM vue_commande_synthese
GROUP BY date_livraison, client_id ) as s
GROUP BY client_id ;

Il est fort probable que cette requête puisse être améliorée.

--
Mes AAD réveillent les morts et redonnent les érections, l'amour,
le retour de l'épouse, le travail et l'argent.
-- Grand Mage Bonaventure Isaac Pochard dans fufe --
Avatar
didier gaumet
On Wed, 21 May 2008 09:29:08 +0200, Jogo wrote:

Non. Elle regroupe toutes les lignes qui ont toutes les colonnes
spécifiées dans la clause GROUP BY identiques. L'ordre n'a aucune
importance et est géré après le GROUP BY.


[...]

Tu as évidemment raison et vu ma grosse dernière douzaine d'années sans
SQL, j'aurais mieux fait de m'abstenir ;-)

Désolé pour le bruit.
1 2