allodren | Bonjour, Merci pour votre attention.
Le but est de calculer un tarif total J'ai une table ACHAT avec id_prod = produit
ty_doc =type de document
nu_doc=numéro de document
nucdli = commande liée
px_com= prix de la commande
id_prod____ty_doc___ nu_doc___ nucdli___px_com
A___________ BE ____ 13604_____________ 4
B____________ BE ____ 13604 _____________ 4
C_______ ___ CDA ___ 13604 _____________ 3
D_______ ___ CDA ___ 13604 _____________ 3
E_______ ___ CDA ___ 13604 ____________ 2
E ______ ___ CDC ___ 13661 ___ 13604 ___ 3
B ______ ___ CDC ___ 13361 ___ 13604 ___ 2
E ______ ___ CDT ___ 13360 ___ 13604 ___ 1
Mon problème est le suivant :
Je souhaite afficher dans le px_com de CDA le cumul des px_com des CDD et des CDT correspondants (quand "nucdli"="nu_doc" )
Du coup, les CDD et CDT correspondantes au CDA doivent disparaitrent !
Au final on doit obtenir id_prod____ty_doc___ nu_doc___ nucdli___px_com
E___________ CDA ____13604 _____________6
B____________ BE ____ 13604 _____________ 4
C_______ ___ CDA ___ 13604 _____________ 3
D_______ ___ CDA ___ 13604 _____________ 3
B ______ ___ CDC ___ 13361 ___ 13604 ____ 2
Voici un jeu de test :
Code :
- CREATE TABLE tbl_ligneachat (id_prod char(1), ty_doc char(3), nu_doc int , nucdli int NULL, px_com int NULL)
- INSERT INTO tbl_ligneachat VALUES ('A','BE',13604,NULL,4)
- INSERT INTO tbl_ligneachat VALUES ('B','BE',13604,4)
- INSERT INTO tbl_ligneachat VALUES ('C','CDA',13604,NULL,3)
- INSERT INTO tbl_ligneachat VALUES ('D','CDA',13604,NULL,3)
- INSERT INTO tbl_ligneachat VALUES ('E','CDA',13604,NULL,2)
- INSERT INTO tbl_ligneachat VALUES ('E','CDC',13661,13604,3)
- INSERT INTO tbl_ligneachat VALUES ('B','CDC',13361,13604,2)
- INSERT INTO tbl_ligneachat VALUES ('E','CDT',13360,13604,1)
- INSERT INTO tbl_ligneachat VALUES ('E','FA',444,NULL,1)
- INSERT INTO tbl_ligneachat VALUES ('E','BE','555',NULL,1)
|
Mais prenons la première partie de la requête, sans le WHERE : C'est à l'intérieur que se situe le problème :
Code :
- 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
|
Cette requête ne me renvoi pas ttes les lignes ...
Si je retire mon SUM la requête me renvoi bien toutes les lignes ...
Si je mets dans mon " GROUP BY" ttes les critères, cela me renvoi toutes les lignes mais ne me calcule pas la somme.
___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 !
Je suis pleinement d'accord avec vous mais je ne dois perdre que 8 lignes (puisqu'il y a 8 ligne où nucdli = nu_document) et non pas 101 !
Lorsque j'ôte cette somme de la requête : J'ai bien toutes mes lignes - 8.
Donc j'ai identifié le calcul comme source de ce problème cornélien.
___________________________________________________________________________________________
Après analyse des groupes Je me suis rendu compte que lorsque je fais mon calcul, toutes les nu_document qui étaient en double, pour un produit, n'étaient pas pris en compte qu'une seule fois ....
EX :
id_prod | nu_doc
100|160
100|160
100|150
La requête ne me retourne que {100;160 et 100;150}
Voila mes cent lignes manquantes.
Comment les rapatriés ? J'ai trouver comment les rapatrier mais cela ne me fait pas le calcul de somme :
Code :
Code :
- 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.id_user,
- k.dt_livraison,
- k.dt_confirmation,
- k.px_commande + coalesce(k3.px_commande,0) AS px_commande
- FROM
- tbl_ligneachat k
- LEFT OUTER JOIN (
- SELECT
- k2.id_produit,
- k2.id_fournisseur,
- k2.dt_document,
- k2.qt_cmde_ini,
- k2.ty_commande,
- k2.id_societe,
- k2.id_offre,
- k2.ty_document,
- k2.nu_document,
- k2.id_user,
- k2.dt_livraison,
- k2.dt_confirmation,
- k2.px_commande,
- k2.nucdli
- FROM tbl_ligneachat K2) AS K3
- ON K3.nucdli IS NOT NULL AND k3.nucdli=k.nu_document
- WHERE K.nucdli IS NULL
- ORDER BY id_produit
|
Cette requête me renvoie toutes les lignes.
Cependant, cela ne m'additionne pas les lignes qui ont un nucdli=nu_document
Toujours le même problème.
J'ai essayé de tourner le code ci-après de différentes façons, je présente la version la plus cohérente. J'espère que j'ai été assez clair...
|