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 :

Requête pour calculer le solde des fournisseurs


Sujet :

Langage SQL

  1. #1
    Membre confirmé Avatar de Issam
    Inscrit en
    Mars 2002
    Messages
    578
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Mars 2002
    Messages : 578
    Points : 604
    Points
    604
    Par défaut Requête pour calculer le solde des fournisseurs
    bonsoir tout le monde
    pour une base de données firebird 2.1
    je sèche un peu sur une requête sql normalement simple,
    c'est une gestion de stock classique avec les tables :
    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 fournisseurs
    (
    id integer NOT NULL PRIMARY KEY,
    nom varchar(255),
    )
     
    CREATE TABLE achats
    (
    id integer NOT NULL PRIMARY KEY,
    id_fournisseur integer , /*clé etrangère*/
    date_facture date
    )
     
    CREATE TABLE achats_details
    (
    id integer NOT NULL PRIMARY KEY,
    id_achat integer , /*clé etrangère*/
    prix   numeric(14,2),
    qte integer
    )
     
    CREATE TABLE reglements
    (
    id integer NOT NULL PRIMARY KEY,
    id_fournisseur integer , /*clé etrangère*/
    montant numeric(14,2)
    )
    je voudrais que pour chaque ligne de fournisseur aficher le solde (somme des reglements - somme des achars)

    la somme des achats doit être calculée a partir de la table achat_details (sum(prix*qte))


    j'ai tenté un truc du genre :
    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 A.ID_FOURNISSEUR, A.FR_NOM,
     
    (select sum(d.ad_prix_ht * d.ad_qte) from achats_details d
     
    where (select ac.ac_id_fournisseur from achats ac where ac.id_achat = d.ad_id_achat) = a.id_fournisseur
    )
    -
    (select sum(r.reg_montant) from reglements r
     
    where r.reg_id_fournisseur = a.id_fournisseur
    )
    From fournisseurs a
    group by 1,2
    mais je ne suis pas très sûr si c'est juste
    en plus il faut gérer les valeurs nulles potentiellement retournées par les deux sous requêtte sum

    merci et bonne fin de journée

  2. #2
    Membre confirmé Avatar de Issam
    Inscrit en
    Mars 2002
    Messages
    578
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Mars 2002
    Messages : 578
    Points : 604
    Points
    604
    Par défaut
    finalement après avoir fait le test, il me semble que la requette est correcte

    reste juste a gérer les valeurs nulles par exemple un fournisseur pour qui on a fait aucun règlement

    sinon vous pensez quoi de cette requette niveau performance ?

  3. #3
    Membre chevronné
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Points : 1 878
    Points
    1 878
    Par défaut
    sinon vous pensez quoi de cette requette niveau performance ?




  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Citation Envoyé par Issam Voir le message
    sinon vous pensez quoi de cette requette niveau performance ?
    Bonjour,


    Pas bonne.

    Plus votre référentiel fournisseur va grossir et plus cette requête va avoir des perfs misérables.

    Le SGBD va l'interpréter comme ceci :
    - scannage de votre table fournisseur
    - Pour chaque ligne résultante exécuter la sous-requête sur les achats
    - Pour chaque ligne résultante executer la sous-requête sur les reglements

    du coup il vaudrai mieux passer par une consolidation des achats / reglements d'abord puis faire une jointure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT A.ID_FOURNISSEUR, A.FR_NOM, COALESCE(sum_ac, 0) - COALESCE(sum_mt, 0)
    FROM fournisseurs a
    left outer join (
     SELECT reg_id_fournisseur, sum(r.reg_montant) as sum_mt 
     FROM reglements 
     group by reg_id_fournisseur) as b on b.reg_id_fournisseur = a.id_fournisseur
    left outer join (
     SELECT e.ac_id_fournisseur, sum(d.ad_prix_ht * d.ad_qte) as sum_ac
     FROM achats_details d
     inner join achats e on e.id_achat = d.ad_id_achat
     group by e.ac_id_fournisseur   = a.id_fournisseur) as c on c.ac_id_fournisseur = a.id_fournisseur

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

Discussions similaires

  1. Requête pour calculer la taille des datafiles
    Par AlternantOracle dans le forum DB2
    Réponses: 9
    Dernier message: 11/05/2010, 14h24
  2. Réponses: 5
    Dernier message: 26/11/2008, 20h05
  3. Réponses: 1
    Dernier message: 21/07/2006, 05h56
  4. Requête pour calculer le temps entre deux dates
    Par Badboy62cfp dans le forum Access
    Réponses: 2
    Dernier message: 19/05/2006, 13h50
  5. Requête pour récupérer le nom des champs
    Par legillou dans le forum JDBC
    Réponses: 1
    Dernier message: 08/02/2006, 16h09

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