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

Requêtes MySQL Discussion :

Calcul de quantité pas facile


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2002
    Messages : 89
    Points : 64
    Points
    64
    Par défaut Calcul de quantité pas facile
    Bonjour à tous,

    Je rencontre un problème de taille avec une base de données.
    Des données provenant d'une structure en arbre (hiérarchie) sont stockées dans une table.

    Une quantité est liée à chaque élément de l'arbre ainsi que sur chaque noeud.
    Mon but est de faire un calcul pour connaitre les quantités utiles lorsqu'un élément se trouve sous un noeud ayant une quantité > 1.

    J'ai élaboré une requête qui me retourne la liste des éléments ainsi que leur parent et les quantités concernées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT p.itemnr AS parent, p.quantity AS parentqty, t.itemnr, t.quantity 
    FROM tls_subbom AS p, tls_subbom AS t
    WHERE (t.lft BETWEEN p.lft AND p.rgt) AND (p.sub_bom_id = 1047888024) AND (t.sub_bom_id = 1047888024) AND (t.itemid > 0)
    ORDER BY t.counter, p.counter
    cela me retourne ceci :
    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
    parent			parentqty	itemnr			quantity
    C			1		1000			1
    1000			1		1000			1
    C			1		1110.67.010.100		3
    1110.67.010.100		3		1110.67.010.100		3
    C			1		0440-80.060.120S	1
    A			1		0440-80.060.120S	1
    0440-80.060.120S	1		0440-80.060.120S	1
    C			1		2222-67.001.155		1
    A			1		2222-67.001.155		1
    2222-67.001.155		1		2222-67.001.155		1
    C			1		1000			1
    B			5		1000			1
    1000			1		1000			1
    C			1		1234-41-04 20-40-25	1
    1234-41-04 20-40-25	1		1234-41-04 20-40-25	1
    Il faudrait pouvoir multiplier les valeurs de la 2e colonne pour chaque élément de la 3e qui sont identique puis multiplier le produit par la 4e colonne.

    Avez-vous une idée pour réaliser ceci en SQL ?

    D'avance merci.

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Quelques remarques sur ta requête :
    1) Les jointures s'écrivent depuis 1992 selon la norme SQL en utilisant l'opérateur JOIN !

    2) Les parenthèses dans le WHERE sont inutiles puisque tu n'as que des AND.

    Ta requête devrait ainsi être écrite de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT p.itemnr AS parent, 
        p.quantity AS parentqty, 
        t.itemnr, t.quantity 
    FROM tls_subbom AS p
    INNER JOIN tls_subbom AS t ON t.lft BETWEEN p.lft AND p.rgt
    WHERE p.sub_bom_id = 1047888024
        AND t.sub_bom_id = 1047888024
        AND t.itemid > 0
    ORDER BY t.counter, p.counter
    Quant à ton besoin, le résultat attendu en fonction des données fournies nous aiderait à comprendre !
    Il faudrait pouvoir multiplier les valeurs de la 2e colonne pour chaque élément de la 3e qui sont identique puis multiplier le produit par la 4e colonne.
    "les" que j'ai mis en gras est ambigü. Ces opérations sont à faire pour chaque ligne ou des regroupements de lignes

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Je ne sais pas si j'ai vraiment compris non plus, mais faire le produit des lignes n'ai pas directement possible en SQL, il faut se rappeler de ses cours de math de lycée :
    http://fr.wikipedia.org/wiki/Logarithme
    http://fr.wikipedia.org/wiki/Fonction_exponentielle
    il faudrait pouvoir multiplier les valeurs de la 2e colonne pour chaque élément de la 3e qui sont identique
    Donc avec t le résultat de ta précédente requête on a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select itemnr, exp(sum(ln(parentqty))) as produit
      from t
     group by itemnr
    qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ITEMNR                 PRODUIT
    ------------------- ----------
    1000                         5
    2222-67.001.155              1
    1234-41-04 20-40-25          1
    1110.67.010.100              3
    0440-80.060.120S             1
    Je te laisse emboiter ça dans des sous-requêtes pour obtenir le résultat souhaité.

Discussions similaires

  1. Champs calculés, ça marche pas ?
    Par Wilco dans le forum Bases de données
    Réponses: 2
    Dernier message: 27/11/2007, 20h15
  2. Réponses: 1
    Dernier message: 09/02/2007, 16h03
  3. [Joomla!] Joomla Pas Facile
    Par sandytarit dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 03/02/2007, 20h48
  4. Réponses: 2
    Dernier message: 15/01/2007, 11h31
  5. un petit histogramme pas facile
    Par Bibouda dans le forum C
    Réponses: 15
    Dernier message: 23/11/2005, 21h17

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