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

MS SQL Server Discussion :

Somme par catégories (Inner join)


Sujet :

MS SQL Server

  1. #1
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 149
    Points : 89
    Points
    89
    Par défaut Somme par catégories (Inner join)
    Bonjour,
    Je souhaite obtenir pour un opérateur, la somme encaissée par jour et par mode de règlement.

    Le problème est similaire à ce post
    http://www.developpez.net/forums/d11...select-select/

    J'ai utilisé cette solution, qui ne me donne pas les resultats escomptés.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT sum(f2.TTC) as esp,sum(f3.TTC) as cb ,sum(f4.ttc) as cheques,f1.operateur,f1.date
    FROM  facture_test f1 
    full outer join facture_test f2 
    on (f2.mode_reglement = 'espèces')
    full outer join facture_test f3 
    on (f3.mode_reglement = 'CB')
    full outer join facture_test f4
    on (f4.mode_reglement = 'Chèques')
    group by f1.operateur,f1.date;

    Voici la structure de la base que j'ai créée pour le test.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE [dbo].[facture_test](
    	[id] [int] IDENTITY(1,1) NOT NULL,
    	[HT] [money] NULL,
    	[TTC] [money] NULL,
    	[TVA] [money] NULL,
    	[operateur] [nchar](10) COLLATE French_CI_AS NULL,
    	[date] [datetime] NULL,
    	[mode_reglement] [nchar](10) COLLATE French_CI_AS NULL,
     CONSTRAINT [PK_facture_test] PRIMARY KEY CLUSTERED 
    (
    	[id] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]

    J'ai essayé INNER JOIN ou LEFT /RIGHT OUTER JOIN mais sans succès. J'avoue que je m'y perds un peu la, malgré ce cours.

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Il vous manque simplement la liaison sur la clé de la table.
    Essayez :

    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
    SELECT FACTURE.operateur,
    		SUM(ESPECE.TTC) AS SommeEspece,
    		SUM(CB.TTC) AS SommeCB,
    		SUM(CHEQUE.TTC) AS SommeCheque
    FROM dbo.facture_test AS FACTURE
    LEFT JOIN dbo.facture_test AS ESPECE
    	ON ESPECE.id = FACTURE.id
    	AND ESPECE.mode_reglement = 'espèces'
    LEFT JOIN dbo.facture_test AS CB
    	ON CB.id = FACTURE.id
    	AND CB.mode_reglement = 'CB'
    LEFT JOIN dbo.facture_test AS CHEQUE
    	ON CHEQUE.id = FACTURE.id
    	AND CHEQUE.mode_reglement = 'Chèques'
    GROUP BY FACTURE.operateur
    Vous voulez toutes les factures, mais faire la somme que sur certaines d'entre elles.
    Il vous faut donc un ensemble qui contient toutes les factures.

    Vous pouvez ensuite faire une auto-demi-jointure gauche sur cet ensemble :
    vous allez conserver toutes les lignes de l'ensemble à gauche de la jointure et retourner NULL pour les colonnes qui n'ont pas de correspondant dans l'ensemble à droite de la jointure.
    Cette correspondance ne peut être établie, dans le cas d'une auto-jointure, que sur la clé primaire de la table.

    Vous devez cependant filtrer la jointure (clauses AND des jointures de la requête que je vous propose), ce qu'on ne peut pas écrire dans une clause WHERE parce que cela filtre l'ensemble de données produit par les jointures.

    @++

  3. #3
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 149
    Points : 89
    Points
    89
    Par défaut
    Ça fonctionne. Merci.

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

Discussions similaires

  1. Somme par catégorie
    Par laurentSc dans le forum Excel
    Réponses: 4
    Dernier message: 02/08/2013, 21h38
  2. Mysql Inner join
    Par ..:: Atchoum ::.. dans le forum Requêtes
    Réponses: 3
    Dernier message: 25/10/2007, 12h21
  3. [ requeste sql ]INNER JOIN / OUTER JOIN
    Par hocinema dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/04/2004, 21h28
  4. Erreur lors d'une requete INNER JOIN
    Par k-lendos dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/03/2004, 15h09
  5. Inner Join & Select
    Par bakaneko dans le forum Langage SQL
    Réponses: 7
    Dernier message: 10/02/2004, 10h48

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