Problème avec GROUP BY

Le
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 !
Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Ph. B.
Le #21897241
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.
Utilisateur1
Le #21897231
Bonjour

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

"Ph. B." 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.
Alain Montfranc
Le #21897221
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 ?
didier gaumet
Le #21897211
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...
Utilisateur1
Le #21897201
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." de news: 48305443$0$28782$
Bonjour,

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

Philippe.
Jogo
Le #21897191
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
didier gaumet
Le #21897181
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...
Jerome PAULIN
Le #21897171
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
Jogo
Le #21897161
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 --
didier gaumet
Le #21897151
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.
Publicité
Poster une réponse
Anonyme