Problème de SUM et GROUP BY

ALLODREN Messages postés 8 Date d'inscription vendredi 17 avril 2009 Statut Membre Dernière intervention 30 juin 2009 - 27 mai 2009 à 15:09
ALLODREN Messages postés 8 Date d'inscription vendredi 17 avril 2009 Statut Membre Dernière intervention 30 juin 2009 - 27 mai 2009 à 15:13
Bonjour,

Concernant le SUM et le GROUP BY :

__On groupe toujours par au moins tous les éléments de la sélection___

Mais dans ce cas : cela ne me calcule pas correctement mon besoin qui est :
Addition des valeurs "px_commande" pour toutes les lignes de ma table qui ont : nucdli = nu_document.
On affiche la somme dans le px_commande de la ligne où se trouve le "nu_document" identique.
Et on ne retient plus la ligne où se trouve le "nucdli" lié.

Ex :

Ma table actuelle est

id_prod | ty_document | nu_document | nucdli | px_commande

A | CDA | 160 | |2
A| CDD | 161 | 160 | 2
A | CDA | 162 | | 2

Je souhaite l' extraire tel que :

A|CDA|160| |4
A|CDA|162||2

Mon premier résultat est l'addition entre la première et seconde ligne qui ont nucdli = nu_document.


---> RÉCAPITULONS:

Dans un premier temps, cette requête regroupe les "nucdli"
(n° commandes liées) et les "nu_document" ( n ° commande ) qui ont les mêmes identifiants ( 2 colonnes dans une même table qui ont les mêmes identifiants).

Dans un second temps, elle est censée additionner les "px_commande" ( le coût des commandes) des regroupements ( au total, il y a 8 regroupement sur 40 664 lignes ).

Étant donnée que ma requête fusionne les "nucdli" et les "nu_document" qui ont les mêmes identifiants, et qu'il y en a 8, la requête devrait me retourner 40 656 lignes.
Or ma requête fait bien la somme et effectue bien la fusion mais ne me renvoi que 40 546 lignes soit une centaine en moins !
Voici ma requête :
SELECT
A.id_produit,
A.id_fournisseur,
A.ty_document,
A.nu_document,
A.qt_cmde_ini ,
A.px_commande,
A.ty_commande,
(A.px_commande*A.qt_cmde_ini) AS Valorisation,
A.id_user

/* Calcul de la somme*/
FROM(
SELECT

k.id_produit,
k.id_fournisseur,
k.dt_document,
k.qt_cmde_ini,
k.ty_commande,
k.id_societe,
k.id_offre,
k.ty_document,
k.nu_document,
k.nucdli,
k.id_user,
k.dt_livraison,
k.dt_confirmation,
sum(k.px_commande) AS px_commande /* Calcul de la somme*/

FROM(
SELECT /* SOUS REQUETE 2. Extraction des données agrégées par CDA*/
z.id_produit,
z.id_fournisseur,
z.dt_document,
z.qt_cmde_ini,
z.ty_commande,
z.id_societe,
z.id_offre,
z.id_user,
z.dt_livraison,
z.dt_confirmation,
z.px_commande,

CASE z.cde_ter /*Dans le cas de cde ter*/
WHEN 0 THEN z.ty_document /* Si cde ter = 0 ( quand ty_document <> CDA alors on récupère ty_document*/
ELSE 'CDA' /* Sinon on récupère CDA*/
END AS ty_document, /*Tout ceci est dans ty_document*/

CASE z.cde_ter
WHEN 1 THEN NULL /* Si ty_document = CDA * alors on récupère rien */
ELSE z.nucdli /*Sinon on récupère z.nucdli*/
END AS nucdli, /*tout ceci est dans nucdli, z.px_commande, z.cde_ter*/
z.cde_ter,

CASE z.cde_ter
WHEN 1 THEN z.nucdli /* Si ty_document = CDA alors on écrit rien z.nucdli */
ELSE z.nu_document /* Sinon on récupère nu_document */
END AS nu_document /* Tout ceci est dans nu_document */


FROM (SELECT *,
/* SOUS REQUETE 3. Agrégation des données dans le cas où nucdli = nu_commande */
CASE
WHEN EXISTS (SELECT 1 /* SOUS REQUETE 4. Extraction des données où nucdli nu_commande et ty_commande CDA */
FROM tbl_ligneachat h
WHERE h.id_produit = q.id_produit
AND q.nucdli = h.nu_document
AND h.ty_document = 'CDA') /* FIN SOUS REQUETE 4 */
THEN 1
ELSE 0
END AS cde_ter

FROM tbl_ligneachat Q
)AS z /* FIN SOUS REQUETE 3 */

)AS k

GROUP BY
k.id_produit,
k.qt_cmde_ini,
k.ty_commande,
k.nu_document,
k.nucdli,
k.id_societe,
k.id_offre
)AS A

Auriez vous une idée ???
 

1 réponse

ALLODREN Messages postés 8 Date d'inscription vendredi 17 avril 2009 Statut Membre Dernière intervention 30 juin 2009
27 mai 2009 à 15:13
Plus clairement :

Concernant le SUM et le GROUP BY :

__On groupe toujours par au moins tous les éléments de la sélection___

Mais dans ce cas : cela ne me calcule pas correctement mon besoin qui est :
Addition des valeurs "px_commande" pour toutes les lignes de ma table qui ont : nucdli = nu_document.
On affiche la somme dans le px_commande de la ligne où se trouve le "nu_document" identique.
Et on ne retient plus la ligne où se trouve le "nucdli" lié.

Ex :

Ma table actuelle est

id_prod | ty_document | nu_document | nucdli | px_commande

A | CDA | 160 | |2
A| CDD | 161 | 160 | 2
A | CDA | 162 | | 2

Je souhaite l' extraire tel que :

A|CDA|160| |4
A|CDA|162||2

Mon premier résultat est l'addition entre la première et seconde ligne qui ont nucdli = nu_document.


---> RÉCAPITULONS:

Dans un premier temps, cette requête regroupe les "nucdli"
(n° commandes liées) et les "nu_document" ( n ° commande ) qui ont les mêmes identifiants ( 2 colonnes dans une même table qui ont les mêmes identifiants).

Dans un second temps, elle est censée additionner les "px_commande" ( le coût des commandes) des regroupements ( au total, il y a 8 regroupement sur 40 664 lignes ).

Étant donnée que ma requête fusionne les "nucdli" et les "nu_document" qui ont les mêmes identifiants, et qu'il y en a 8, la requête devrait me retourner 40 656 lignes.
Or ma requête fait bien la somme et effectue bien la fusion mais ne me renvoi que 40 546 lignes soit une centaine en moins !
Voici ma requête :
SELECT
A.id_produit,
A.id_fournisseur,
A.ty_document,
A.nu_document,
A.qt_cmde_ini ,
A.px_commande,
A.ty_commande,
(A.px_commande*A.qt_cmde_ini) AS Valorisation,
A.id_user

/* Calcul de la somme*/
FROM(
SELECT

k.id_produit,
k.id_fournisseur,
k.dt_document,
k.qt_cmde_ini,
k.ty_commande,
k.id_societe,
k.id_offre,
k.ty_document,
k.nu_document,
k.nucdli,
k.id_user,
k.dt_livraison,
k.dt_confirmation,
sum(k.px_commande) AS px_commande /* Calcul de la somme*/

FROM(
SELECT /* SOUS REQUETE 2. Extraction des données agrégées par CDA*/
z.id_produit,
z.id_fournisseur,
z.dt_document,
z.qt_cmde_ini,
z.ty_commande,
z.id_societe,
z.id_offre,
z.id_user,
z.dt_livraison,
z.dt_confirmation,
z.px_commande,

CASE z.cde_ter /*Dans le cas de cde ter*/
WHEN 0 THEN z.ty_document /* Si cde ter = 0 ( quand ty_document <> CDA alors on récupère ty_document*/
ELSE 'CDA' /* Sinon on récupère CDA*/
END AS ty_document, /*Tout ceci est dans ty_document*/

CASE z.cde_ter
WHEN 1 THEN NULL /* Si ty_document = CDA * alors on récupère rien */
ELSE z.nucdli /*Sinon on récupère z.nucdli*/
END AS nucdli, /*tout ceci est dans nucdli, z.px_commande, z.cde_ter*/
z.cde_ter,

CASE z.cde_ter
WHEN 1 THEN z.nucdli /* Si ty_document = CDA alors on écrit rien z.nucdli */
ELSE z.nu_document /* Sinon on récupère nu_document */
END AS nu_document /* Tout ceci est dans nu_document */


FROM (SELECT *,
/* SOUS REQUETE 3. Agrégation des données dans le cas où nucdli = nu_commande */
CASE
WHEN EXISTS (SELECT 1 /* SOUS REQUETE 4. Extraction des données où nucdli nu_commande et ty_commande CDA */
FROM tbl_ligneachat h
WHERE h.id_produit = q.id_produit
AND q.nucdli = h.nu_document
AND h.ty_document = 'CDA') /* FIN SOUS REQUETE 4 */
THEN 1
ELSE 0
END AS cde_ter

FROM tbl_ligneachat Q
)AS z /* FIN SOUS REQUETE 3 */

)AS k

GROUP BY
k.id_produit,
k.qt_cmde_ini,
k.ty_commande,
k.nu_document,
k.nucdli,
k.id_societe,
k.id_offre
)AS A

Auriez vous une idée ???
0
Rejoignez-nous