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 :

Sous-requête : somme des factures + avoirs par fournisseur et par date


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 14
    Points : 5
    Points
    5
    Par défaut Sous-requête : somme des factures + avoirs par fournisseur et par date
    Bonjour,

    Je sollicite votre aide afin d'effectuer une imbrication de deux requêtes et ainsi d’obtenir la somme des montants des factures et des avoirs par fournisseur et par date de document.
    Mon post peut paraître long mais j’ai essayé de donner un maximum d’informations.
    Pour information, j’utilise une base SQL Server 2008 R2 et Reporting Services.

    Le schéma ci-dessous représente les liaisons entre les tables et les résultats obtenus pour mes deux requêtes distinctives (avoirs et factures) :
    Nom : table.jpg
Affichages : 941
Taille : 81,4 Ko

    Les expressions SQL de mes requêtes sont les suivantes (les résultats correspondent à mes attentes) :

    Avoirs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT     Entete_Avoir.Nom_fournisseur, SUM(Lignes_Avoir.Montant_ligne) AS A_montant, Entete_Avoir.Date_document AS A_date
    FROM         Entete_Avoir INNER JOIN
                          Fournisseur ON Entete_Avoir.No_fournisseur = Fournisseur.No_ INNER JOIN
                          Lignes_Avoir ON Entete_Avoir.No_ = Lignes_Avoir.No_document
    GROUP BY Entete_Avoir.Nom_fournisseur, Entete_Avoir.Date_document
    HAVING      (Entete_Avoir.Nom_fournisseur LIKE 'LA POSTE')
    Factures
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT     Entete_facture.Nom_fournisseur, SUM(Lignes_facture.Montant_ligne) AS F_montant, Entete_facture.Date_document AS F_date
    FROM         Entete_facture INNER JOIN
                          Fournisseur ON Entete_facture.No_fournisseur = Fournisseur.No_ INNER JOIN
                          Lignes_facture ON Entete_facture.No_ = Lignes_facture.No_document
    GROUP BY Entete_facture.Nom_fournisseur, Entete_facture.Date_document
    HAVING      (Entete_facture.Nom_fournisseur LIKE 'LA POSTE')
    Pour simplifier (??), j'ai filtré sur 'La Poste' comme unique fournisseur.

    Cela se complique lorsque je veux imbriquer mes deux requêtes afin d’obtenir le résultat suivant :
    Nom : resultats souhaites.jpg
Affichages : 774
Taille : 39,3 Ko

    Je n’obtiens pas le résultat escompté avec la requête suivante :
    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
    SELECT *
    FROM (
    SELECT     Entete_facture.Nom_fournisseur, SUM(Lignes_facture.Montant_ligne) AS F_montant, Entete_facture.Date_document AS F_date
    FROM         Entete_facture INNER JOIN
                          Fournisseur ON Entete_facture.No_fournisseur = Fournisseur.No_ INNER JOIN
                          Lignes_facture ON Entete_facture.No_ = Lignes_facture.No_document
    GROUP BY Entete_facture.Nom_fournisseur, Entete_facture.Date_document
    HAVING      (Entete_facture.Nom_fournisseur LIKE 'LA POSTE')
    )AS FACTURES
    INNER JOIN (
    SELECT     Entete_avoir.Nom_fournisseur, SUM(Lignes_Avoir.Montant_ligne) AS A_montant, Entete_avoir.Date_document AS A_date
    FROM         Entete_avoir INNER JOIN
                          Fournisseur ON Entete_avoir.No_fournisseur = Fournisseur.No_ INNER JOIN
                          Lignes_Avoir ON Entete_avoir.No_ = Lignes_Avoir.No_document
    GROUP BY Entete_avoir.Nom_fournisseur, Entete_avoir.Date_document
    HAVING      (Entete_avoir.Nom_fournisseur LIKE 'LA POSTE')
    ) AS AVOIRS
    ON FACTURES.Nom_fournisseur = AVOIRS.Nom_fournisseur
    Résultats obtenus :
    Nom : resultats obtenus v1.jpg
Affichages : 663
Taille : 92,4 Ko

    En effet :
    - Je souhaiterais que les deux colonnes fournisseurs et les deux colonnes dates soient « fusionnées »
    - Je n’ai pas encore essayé de calculer le solde.

    De plus, la liaison avec la table « Fournisseur » est-elle nécessaire si je ne souhaite pas obtenir d’information de cette dernière ?

    Merci d’avance pour votre aide,
    Images attachées Images attachées  

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Il manque une condition sur la date dans votre jointure.
    D'ailleurs, si vous pouvez avoir plusieurs factures ou avoirs à la même date pour un fournisseur donné, il faudra regrouper également par date (et faire la somme des montants)


    Il vous faudra par contre faire une jointure externe bilatérale ( FULL OUTER JOIN ) afin de conserver les lignes de facture pour les dates auxquelles il n'y a pas d'avoir et inversement.

    Enfin, utilisez COALESCE pour obtenir la date soit depuis la table des avoirs, soit depuis la table des factures, ainsi que pour obtenir un montant à 0 plutôt que NULL.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Merci pour ce début d'information.

    Tu as bien saisi ma demande car il est effectivement possible d'avoir des factures sans avoir à la même date pour un fournisseur donné (et inversement, beaucoup plus rare).

    Je comprends le principe des deux "fonctions" à utiliser (Full outer join ; coalesce) mais je ne vois pas où les insérer dans ma requête...

    EDIT :
    J'ai réussi à obtenir à peu près ce que je souhaite grâce au topic suivant : http://www.developpez.net/forums/d13...fusion-tables/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT coalesce(e.semaine,s.semaine),coalesce(nombre_entrees,0) AS entrees,coalese(nombre_sorties,0) AS sorties
    FROM entree e
    full OUTER JOIN sorties s
    ON e.semaine = s.semaine
    Finalement pour le solde, je ne le fait pas directement dans ma requête mais dans l'outil de conception de SSRS. Car dans la requête, si j'avais un avoir à 0 (grâce à coalesce), le solde Facture-Avoir renvoyait 0.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par Plumtree Voir le message
    Finalement pour le solde, je ne le fait pas directement dans ma requête mais dans l'outil de conception de SSRS. Car dans la requête, si j'avais un avoir à 0 (grâce à coalesce), le solde Facture-Avoir renvoyait 0.
    C'est parce que vous avez mal utilisé le COALESCE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    COALESCE(10, 0) - COALESCE(NULL, 0)
    Renvoie (10 - 0), soit 10
    Alors que
    Renvoie 0, car (10 - NULL) renvoie NULL.

Discussions similaires

  1. Requête: Liste des Factures impayées
    Par mameziane dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 01/11/2011, 11h55
  2. Réponses: 11
    Dernier message: 07/03/2010, 21h09
  3. obtenir le dernier prix d'achat par fournisseur et par produit
    Par lidybekham07 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 16/11/2009, 16h26
  4. Requête Somme des factures !
    Par nicou50 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 01/09/2006, 03h10
  5. Réponses: 3
    Dernier message: 24/08/2006, 11h56

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