IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Problème Calcul Tarif total complexe


Sujet :

Langage SQL

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 139
    Points : 73
    Points
    73
    Par défaut Problème Calcul Tarif total complexe
    Bonjour,

    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

    J'utilise Jasperserver avec MySQL.

    N'hésiter pas pour plus de renseignement
    C'est une requête que je tente de résoudre depuis fort longtemps.
    Soit c'est moi qui bug, soit c'est vraiment compliqué !!!

    Merci à tous

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 802
    Points
    30 802
    Par défaut
    Pourrais-tu nous donner la structure de ta table ainsi qu'une première ébauche de ta requête ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,
    De ce que tu nous en as dit, tu peux essayer avec cette requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT 
    	   a1.id_prod, a1.ty_doc, a1.nu_doc, a1.nucdli, nvl(a1.px_com,0) + nvl(a2.px_com,0) as px_com
    FROM ACHAT a1
    LEFT JOIN 
    	 (
    	  SELECT id_prod, nucdli, sum(px_com) as px_com
    	  FROM ACHAT
    	  WHERE (ty_doc <> 'CDA' OR nucdli IS NOT NULL)
    	  GROUP BY id_prod, nucdli
    	 ) a2
    	 ON a1.id_prod = a2.id_prod
    	 AND a1.nu_doc = a2.nucdli
    WHERE (a1.ty_doc = 'CDA' OR a1.nucdli IS NULL)
    Après, faut voir si tu peux avoir plusieurs lignes CDA pour un même couple id_prod/nu_doc, et si oui ce que tu veux en faire.
    Pareil pour les clauses WHERE, j'ai fait un peu au hasard par rapport à ton jeu de données, faut voir si ça correspond bien à ce que tu cherches.

    Concernant la remarque d'Al1_24, fournir ce que tu as déjà essayer et un jeu d'essai facilitera le travail de ceux qui veulent t'aider, quelque chose de ce gout là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    create table achat
    (
     id_prod varchar2 (50),
     ty_doc varchar2 (50),
     nu_doc NUMBER,
     nucdli NUMBER,
     px_com NUMBER
    ) ;
     
    insert into achat
    select * from
    (
     select 'A','BE',13604,NULL,4 FROM dual
     union all
     select 'B', 'BE',13604,NULL, 4 from dual
     union all
     select 'C','CDA',13604,NULL,3 from dual
     union all
     select 'D','CDA',13604,NULL, 3 from dual
     union all
     select 'E','CDA',13604,NULL, 2 from dual
     union all
     select 'E','CDC',13661,13604, 3 from dual
     union all
     select 'B','CDC',13661,13604, 2 from dual
     union all
     select 'E','CDT',13660,13604, 1 from dual
    );

  4. #4
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 139
    Points : 73
    Points
    73
    Par défaut RE : Tarif complexe
    Ma table à plus de 30 colonnes, j'ai selectionné les infos nécessaires à l'extraction des données du problème. Je ne peux pas les recopier toutes !

    C'est une table "ligne achat" qui fait la correspondance avec les fournisseurs et les produits.
    On doit gérer le type de document "CDA" : commandes qui sont confirmées. Les autres types, on ne s'en occupe pas.
    Pour un type de document "CDA", on peut avoir plusieurs CDD, frais de douane, et plusieurs CDT, frais de transport.
    Néanmoins, les CDD et CDT sont dans la même colone !
    Donc il ont mis un identifiant "nucdli" afin de les différencier et les lier aux CDA.

    Le but est de concaténer les CDD et CDT dans le CDA afin d'établir un rapport par produit et par CDA incluant l'ensemble des frais.

    Le début de ma requête serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT id_produit, ty_document,nu_document,nucdli,
    if(nu_document like nucdli,SUM(px_commande),px_commande) as px_commande
    FROM tbl_ligneachat;
    J'ai essayé des EXISTS, des HAVING SUM ...
    et les sous requêtes avec Mysql plantent !!!

    Là, j'avoue, je désespère ...

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Quelle version de mysql utilises tu?

  6. #6
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 139
    Points : 73
    Points
    73
    Par défaut
    J'utilise la version 5.0.27

    Mais il ne reconnait pas la fonction nvl du coup j'ai remplacé par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT
           a1.id_produit, a1.ty_document, a1.nu_document, a1.nucdli,
     if(a1.px_commande and a2.px_commande is not null,a1.px_commande + a2.px_commande,0) AS px_com
    FROM tbl_ligneachat a1
    LEFT JOIN
         (
          SELECT id_produit, nucdli, sum(px_commande) AS px_commande
          FROM tbl_ligneachat
          WHERE (ty_document <> 'CDA' OR nucdli IS NOT NULL)
          GROUP BY id_produit, nucdli
         ) a2
         ON a1.id_produit = a2.id_produit
         AND a1.nu_document = a2.nucdli
    WHERE (a1.ty_document = 'CDA' OR a1.nucdli IS NULL)
    Le probleme est que cela me renvoit tout le temps null dans les nucdli !!!
    Et cela n'affiche un tarif toujours égal à 0

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Pour ton probleme de total, utilise coalesce à la place de nvl.
    Ensuite, si tu veux récupérer le nucdli, remplace a1.nucdli par a2.nucdli.

  8. #8
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Vous bidouillez vos données dans vos colonnes il parait normal que le traitement de ces dites données devienne rapidement une usine a gaz.

    Essayer ce genre de requete (a tester et adapter)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    select 
      tbl_ligneachat.id_prod, 
      /* Ligne de commande confirmée donc on ne change rien */
      case a.ty_doc when 'CDA' then 'CDA' else tbl_ligneachat.ty_doc end as ty_doc , 
      case a.ty_doc when 'CDA' then a.nu_doc else tbl_ligneachat.nu_doc end as nu_doc,
      case a.ty_doc when 'CDA' then null else tbl_ligneachat.nucdli end as nucdli,
            sum(tbl_ligneachat.px_com)
    from 
       tbl_ligneachat  left outer join 
     (select  
          b.id_prod,
          COALESCE(b.ty_doc,a.ty_doc) as ty_doc , 
          b.nu_doc, b.nucdli, 
          sum(COALESCE(b.px_com,a.px_com)) as px_com
       from 
           tbl_ligneachat a  join tbl_ligneachat b 
               on (a.nucdli = b.nu_doc  and a.id_prod=b.id_prod)
           group by 
             b.id_prod,
             COALESCE(b.ty_doc,a.ty_doc)  , 
             b.nu_doc, 
             b.nucdli
    ) a 
    on (tbl_ligneachat.id_prod= a.id_prod )
    where 
      tbl_ligneachat.ty_doc ='CDA' or a.ty_doc is not null
    group by 
        tbl_ligneachat.id_prod, 
        case a.ty_doc when 'CDA' then 'CDA' else tbl_ligneachat.ty_doc end  ,    
        case a.ty_doc when 'CDA' then a.nu_doc else tbl_ligneachat.nu_doc end ,
        case a.ty_doc when 'CDA' then null else tbl_ligneachat.nucdli end
    A modele defaillant, requetes complexes

    Bon courage
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  9. #9
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 139
    Points : 73
    Points
    73
    Par défaut
    Je vais tester vos deux requêtes ....

  10. #10
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 139
    Points : 73
    Points
    73
    Par défaut
    La requête de SNIPAH fonctionne trés bien toute seule.
    Toutefois, lorsque que je l'ajoute au reste de ma requête : il n'y a aucune réponse !
    Je pense que cela vient des jointures ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    select
    a2.nucdli, coalesce(a.px_commande,0) + coalesce(a2.px_commande,0) AS px_commande,
    A.id_fournisseur,
    A.nu_document,
    A.dt_document,
    A.qt_cmde_ini,
    CASE
    WHEN A.ty_document="CDD" THEN A.qt_cmde_ini="0"
    WHEN A.ty_document="CDT" THEN A.qt_cmde_ini="0"
    WHEN A.ty_document="CDC" THEN A.qt_cmde_ini="0"
    Else A.qt_cmde_ini
    END AS QTE ,
    A.px_commande*A.qt_cmde_ini as Valorisation,
    B.li_raison_sociale,
    C.li_produit,
    C.id_famille_produit,
    C.id_division_produit,
    F.li_couleur,
    F.li_marquage,
    F.li_composition,
    A.ty_commande
    FROM
     
    tbl_ligneachat as A
    left outer join tbl_fichetech as F
    on A.id_societe = F.id_societe
    and A.id_produit = F.id_produit
    left outer join tbl_offre as E
    on A.id_societe = E.id_societe
    and A.id_offre = E.id_offre
     
    LEFT JOIN
         (
         SELECT id_produit, nucdli, sum(px_commande) AS px_commande
         FROM tbl_ligneachat A
         WHERE (A.ty_document <> 'CDA' OR A.nucdli IS NOT NULL)
         GROUP BY A.id_produit, A.nucdli
         ) a2
         ON a.id_produit = a2.id_produit
         AND a.nu_document = a2.nucdli,
    tbl_fournisseur as B,
    tbl_produit as C
     
    WHERE
    (a.ty_document = 'CDA' OR a.nucdli IS NULL)
    and A.id_societe = B.id_societe and A.id_fournisseur = B.id_fournisseur
    and A.id_societe = C.id_societe and A.id_produit = C.id_produit
    and C.id_division_produit
    and A.id_produit
    and B.li_raison_sociale
    and C.id_categorie_produit
    and C.id_famille_produit
    and C.id_sousfamille_produit
    and A.id_user
    and ifnull(A.ty_commande,"")
    and ifnull(E.id_offre,"")
    and ifnull(E.ty_offre,"")
    and
    case
    when A.ty_document = "DMA" then A.dt_document
    when A.ty_document = "BE" then A.dt_document
    when A.ty_document = "CDA" then ifnull(A.dt_confirmation,"1900-01-01")
    else if(A.dt_livraison="0000-00-00","1900-01-01",A.dt_livraison)
    end
     
    order by
    C.id_famille_produit,
    B.li_raison_sociale,
    A.id_produit,
    if (A.ty_document in ("CDC", "CDD", "CDT"), "CDA", A.ty_document);

  11. #11
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    J'ai essayer de reproduire votre environnement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    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,null,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)

    puis j'ai passé ma requete

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    SELECT   tbl_ligneachat.id_prod,
             CASE a.ty_doc
               WHEN 'CDA' THEN 'CDA'
               ELSE tbl_ligneachat.ty_doc
             END AS ty_doc,
             CASE a.ty_doc
               WHEN 'CDA' THEN a.nu_doc
               ELSE tbl_ligneachat.nu_doc
             END AS nu_doc,
             CASE a.ty_doc
               WHEN 'CDA' THEN NULL
               ELSE tbl_ligneachat.nucdli
             END AS nucdli,
             Sum(tbl_ligneachat.px_com)
    FROM     tbl_ligneachat
             LEFT OUTER JOIN (SELECT   b.id_prod,
                                       Coalesce(b.ty_doc,a.ty_doc)      AS ty_doc,
                                       b.nu_doc,
                                       b.nucdli,
                                       Sum(Coalesce(b.px_com,a.px_com)) AS px_com
                              FROM     tbl_ligneachat a
                                       JOIN tbl_ligneachat b
                                         ON (a.nucdli = b.nu_doc
                                             AND a.id_prod = b.id_prod)
                              GROUP BY b.id_prod,
                                       Coalesce(b.ty_doc,a.ty_doc),
                                       b.nu_doc,
                                       b.nucdli) a
               ON (tbl_ligneachat.id_prod = a.id_prod)
    WHERE    tbl_ligneachat.ty_doc = 'CDA'
              OR a.ty_doc IS NOT NULL
    GROUP BY tbl_ligneachat.id_prod,
             CASE a.ty_doc
               WHEN 'CDA' THEN 'CDA'
               ELSE tbl_ligneachat.ty_doc
             END,
             CASE a.ty_doc
               WHEN 'CDA' THEN a.nu_doc
               ELSE tbl_ligneachat.nu_doc
             END,
             CASE a.ty_doc
               WHEN 'CDA' THEN NULL
               ELSE tbl_ligneachat.nucdli
             END
    resultats :

    id_prod ty_doc nu_doc nucdli
    ------- ------ ----------- ----------- -----------
    B BE 13604 NULL 4
    B CDC 13361 13604 2
    C CDA 13604 NULL 3
    D CDA 13604 NULL 3
    E CDA 13604 NULL 6
    resulats de la requete de Snipah

    id_prod ty_doc nu_doc nucdli px_com
    ------- ------ ----------- ----------- -----------
    A BE 13604 NULL 4
    B BE 13604 NULL 6
    C CDA 13604 NULL 3
    D CDA 13604 NULL 3
    E CDA 13604 NULL 6
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  12. #12
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 139
    Points : 73
    Points
    73
    Par défaut
    Yanika,
    Votre code fonctionne en effet mieux.
    Néanmoins, il vous manque une donné que je n'ai pas mentionné clairement :

    Ajoutons dans ce jeu de données de nouvelles valeurs afin de correspondre davantage à la réalité :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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)



    Votre requête additionne tous les produits E car, à un moment donné, sa CDA est liée à un frais (CDD...) !!!

    Or il ne faut additionner que le produit E qui a une CDA liée !!!

    Exemple de réponse pour ce jeu de données avec votre requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    id_prod ty_doc nu_doc nucdli 
    ------- ------ ----------- ----------- ----------- 
    B BE 13604 NULL 4 
    B CDC 13304 13604 2 
    C CDA 13604 NULL 3 
    E CDA 13604 NULL 3 
    E CDA 13604 NULL 8
    Or la réponse doit être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    id_prod ty_doc nu_doc nucdli 
    ------- ------ ----------- ----------- ----------- 
    A BE 13604 NULL 4 
    B BE 13604 NULL 4
    C CDA 13604 NULL 3 
    D CDA 13604 NULL 3 
    E CDA 13604 NULL 6
    E FA 555 NULL 1
    E BE 444 NULL 1

  13. #13
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    et quid du

    B CDC 13304 13604 2

    ??
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  14. #14
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 139
    Points : 73
    Points
    73
    Par défaut
    OUi
    excusez moi, il doit etre répété FORCEMENT avec le produit A aussi qui est totalement indépendant !!!
    Je l'ai oublié à la saisie ...


    IL me semble que cet un problème de groupement .

  15. #15
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 139
    Points : 73
    Points
    73
    Par défaut Suite TARIF COMPLEXE (17/04/09)
    Bonjour, je remets sur le tapis une requête portant sur le calcul d'un tarif datant de vendredi dernier afin d'y apporter une réponse :

    Citation Envoyé par ALLODREN Voir le message
    Yanika,
    Votre code fonctionne en effet mieux.
    Néanmoins, il vous manque une donné que je n'ai pas mentionné clairement :

    Ajoutons dans ce jeu de données de nouvelles valeurs afin de correspondre davantage à la réalité :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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)



    Votre requête additionne tous les produits E car, à un moment donné, sa CDA est liée à un frais (CDD...) !!!

    Or il ne faut additionner que le produit E qui a une CDA liée !!!

    Exemple de réponse pour ce jeu de données avec votre requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    id_prod ty_doc nu_doc nucdli 
    ------- ------ ----------- ----------- ----------- 
    B BE 13604 NULL 4 
    B CDC 13304 13604 2 
    C CDA 13604 NULL 3 
    E CDA 13604 NULL 3 
    E CDA 13604 NULL 8
    Or la réponse doit être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    id_prod ty_doc nu_doc nucdli 
    ------- ------ ----------- ----------- ----------- 
    A BE 13604 NULL 4 
    B BE 13604 NULL 4
    B CDC 13304 13604 2 
    C CDA 13604 NULL 3 
    D CDA 13604 NULL 3 
    E CDA 13604 NULL 6
    E FA 555 NULL 1
    E BE 444 NULL 1

    Merci de prendre en compte les modifications et si jamais vous avez des idées pour résoudre cette requête ...

  16. #16
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Il semble que dans vos modifications subsistent encore quelques anomalies :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    INSERT INTO tbl_ligneachat VALUES ('E','FA',444,NULL,1)
    INSERT INTO tbl_ligneachat VALUES ('E','BE','555',NULL,1)
    alors que resultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    E FA 555 NULL 1
    E BE 444 NULL 1
    Ce qui me semble inversé...

    De meme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    B CDC 13304 13604 2
    ne devrait il pas etre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    B CDC 13361 13604 2
    ?

    Voici une requete qui vous vous aidera peut etre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
     
    SELECT   id_prod,
             ty_doc,
             nu_doc,
             nucdli,
             Sum(px_com)
    FROM     (SELECT z.id_prod,
                     CASE z.cde_ter
                       WHEN 0 THEN z.ty_doc
                       ELSE 'CDA'
                     END AS ty_doc,
                     CASE z.cde_ter
                       WHEN 1 THEN NULL
                       ELSE z.nucdli
                     END AS nucdli,
                     z.px_com,
                     z.cde_ter,
                     CASE z.cde_ter
                       WHEN 1 THEN z.nucdli
                       ELSE z.nu_doc
                     END AS nu_doc
              FROM   (SELECT *,
                             CASE
                               WHEN EXISTS (SELECT 1
                                            FROM   tbl_ligneachat a
                                            WHERE  a.id_prod = b.id_prod
                                                   AND b.nucdli = a.nu_doc
                                                   AND a.ty_doc = 'CDA') THEN 1
                               ELSE 0
                             END AS cde_ter
                      FROM   tbl_ligneachat b) AS z) AS e
    GROUP BY id_prod,
             ty_doc,
             nu_doc,
             nucdli
    A tester et adapter
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  17. #17
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 139
    Points : 73
    Points
    73
    Par défaut
    Votre code est mieux que le précedent et plus rapide.
    Toutefois j'ai un autre problème de taille :

    Lorsque que j'insère cette requête dans la requête principale :
    Le programme ne renvoit aucune valeur !!!

    A mon avis, cela vient des jointures et des sous-requêtes.

    Voici le code final ( en rouge le code de la requête de calcul du tarif ajouté) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    select
    
      ?.id_produit,
      ?.ty_document,
      ?.nu_document,
      ?.nucdli,
      A.id_fournisseur,
      A.dt_document,
      A.qt_cmde_ini,
    
    CASE 
        WHEN A.ty_document="CDD" THEN A.qt_cmde_ini="0"
        WHEN A.ty_document="CDT" THEN A.qt_cmde_ini="0"
        WHEN A.ty_document="CDC" THEN A.qt_cmde_ini="0"
        Else A.qt_cmde_ini
        END AS QTE ,
    
      A.px_commande*A.qt_cmde_ini as Valorisation,
      B.li_raison_sociale,
      C.li_produit,
      C.id_famille_produit,
      C.id_division_produit,
      F.li_couleur,
      F.li_marquage,
      F.li_composition,
      A.ty_commande,
      Sum(y.px_commande) as px_commande
    FROM
    (SELECT z.id_produit,
                     CASE z.cde_ter
                       WHEN 0 THEN z.ty_document
                       ELSE 'CDA'
                     END AS ty_document,
                     CASE z.cde_ter
                       WHEN 1 THEN NULL
                       ELSE z.nucdli
                     END AS nucdli,
                     z.px_commande,
                     z.cde_ter,
                     CASE z.cde_ter
                       WHEN 1 THEN z.nucdli
                       ELSE z.nu_document
                     END AS nu_document
              FROM   (SELECT *,
                             CASE
                               WHEN EXISTS (SELECT 1
                                            FROM   tbl_ligneachat a
                                            WHERE  a.id_produit = b.id_produit
                                                   AND b.nucdli = a.nu_document
                                                   AND a.ty_document = 'CDA') THEN 1
                               ELSE 0
                             END AS cde_ter
                      FROM   tbl_ligneachat b) AS z) AS Y,
    
      tbl_ligneachat as A
      left outer join tbl_fichetech as F
        on A.id_societe = F.id_societe
        and A.id_produit = F.id_produit
      left outer join tbl_offre as E
        on A.id_societe = E.id_societe
        and A.id_offre = E.id_offre,
      tbl_fournisseur as B,
      tbl_produit as C
    
    
    
    WHERE
    
     A.id_societe = B.id_societe and A.id_fournisseur = B.id_fournisseur
      and A.id_societe = C.id_societe and A.id_produit = C.id_produit
      and C.id_division_produit between "" and "ZZZ"
      and A.id_produit between "" and "ZZZZZZZZZZZZZZZZZ"
      and B.li_raison_sociale between "" and "ZZZZZZZZZZZZZZZZZ"
      and C.id_categorie_produit between "" and "ZZZ"
      and C.id_famille_produit between "" and "ZZZ"
      and C.id_sousfamille_produit between "" and "ZZZ"
      and A.id_user between "" and "ZZZZZZZZZZZZZZZZZ"
      and ifnull(A.ty_commande,"") between "" and "ZZZ"
      and ifnull(E.id_offre,"") between "" and "ZZZ"
      and ifnull(E.ty_offre,"") between "" and "ZZZ"
    
    
    GROUP BY
             ?.id_produit,
             ?.ty_document,
             ?.nu_document,
             ?.nucdli
    
    order by
    
     C.id_famille_produit,
     B.li_raison_sociale,
     A.id_produit,
     if (A.ty_document in ("CDC", "CDD", "CDT"), "CDA", A.ty_document)
    J'ai cinq tables :

    tbl_ligneachat : description des achats
    tbl_fournisseur : description des fournisseurs
    tbl_produit : description des produits
    tbl_offre : description des offres
    tbl_fichetech : description des produits en détails

    J'ai mis des points d'interrogation pour savoir sur quelle table les champs se rattachaient (?)

  18. #18
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Votre Group by n'est pas tres academique du coup...

    Peut etre eut il mieux fallu ne pas externaliser le Sum dans votre requete principale, mais utiliser une sous requete qui ferait alors partie de votre série de jointure.

    Bon courage
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  19. #19
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 139
    Points : 73
    Points
    73
    Par défaut
    Merci pour votre coopération !

  20. #20
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Pensez au tag "Résolu" si votre probleme est solutionné
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème pour calculer un nombre complexe en Fortran
    Par Flying Hermes dans le forum Fortran
    Réponses: 3
    Dernier message: 26/03/2017, 03h28
  2. [2012] problème calcul total stock
    Par Anthony_C dans le forum Développement
    Réponses: 1
    Dernier message: 09/09/2014, 08h59
  3. [2008R2] Membre calculé: Problème dans le total général
    Par Rymaya dans le forum SSAS
    Réponses: 6
    Dernier message: 09/08/2012, 10h42
  4. Problème calculs js
    Par dogi dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 21/02/2006, 13h43
  5. [rave report] Calculer un total
    Par webbulls dans le forum Rave
    Réponses: 2
    Dernier message: 24/05/2004, 16h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo