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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 139
    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 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 136
    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 émérite
    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
    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 confirmé

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 139
    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 émérite
    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
    Par défaut
    Quelle version de mysql utilises tu?

  6. #6
    Membre confirmé

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 139
    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 émérite
    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
    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.

+ 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