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 :

résultats inattendu avec jointure


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 13
    Points : 12
    Points
    12
    Par défaut résultats inattendu avec jointure
    Salut à tous,
    je n'arrive pas à obtenir les résultats attendu pour ce qui suit:
    j'ai 2 tables
    VENTE
    DateV MontantVente TypeReglement
    01/01/2009 10 ESPECE
    01/01/2009 15 ESPECE
    02/01/2009 20 CHEQUE

    REGLEMENT
    DateR MontantReglement
    01/01/2009 20
    02/01/2009 10

    je veux obtenir le résultat suivant

    Date ESPECE CHEQUE REGLEMENT
    01/01/2009 25 0 20
    02/01/2009 0 20 10

    j'utilise la requête suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT 
     DateV,
     sum(DECODE(VENTE.DateV, 'ESPECE' , VENTE.MontantV , 0 ) as ESPECE,
     sum(DECODE(VENTE.DateV, 'CHEQUE' , VENTE.MontantV , 0 ) as CHEQUE,
     sum(REGLEMENT.MontantR) as REGLEMENT
     
     FROM VENTE LEFT OUTER JOIN REGLEMENT ON VENTE.DateV = REGLEMENT.DateR 
     
     GROUP BY DateV
    la partie 'decode' fonctionne mais la dernière colonne me donne des cumuls

    Date ESPECE CHEQUE REGLEMENT
    01/01/2009 25 0 xxx 40 xxx
    02/01/2009 0 20 10

    quelqu'un pour me donner la bonne syntaxe.
    Merci encore

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Il faut faire vos aggrégats vente et règlement avant la jointure.
    J'ai quelque peu corsé votre exemple :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    With VENTE
    AS
    (
    select '01/01/2009' as DateV, 10 as MontantV, 'ESPECE' as Typ from dual union all
    select '01/01/2009'         , 15            , 'ESPECE'        from dual union all
    select '02/01/2009'         , 20            , 'CHEQUE'        from dual union all
    select '04/01/2009'         ,  5            , 'CHEQUE'        from dual
    ),
         REGLEMENT
    AS
    (
    select '01/01/2009' as DateR, 20 as MontantR from dual union all
    select '02/01/2009'         , 10             from dual union all
    select '03/01/2009'         , 15             from dual
    )
    SELECT
        coalesce(VAgg.DateV, RAgg.DateR) AS DATE_PAY,
        coalesce(VAgg.ESPECE, 0)         AS ESPECE,
        coalesce(VAgg.CHEQUE, 0)         AS CHEQUE,
        coalesce(RAgg.REGLEMENT, 0)      AS REGLEMENT
    FROM
        ( SELECT V.DateV,
                 sum(case V.Typ when 'ESPECE' then V.MontantV else 0 end) AS ESPECE,
                 sum(case V.Typ when 'CHEQUE' then V.MontantV else 0 end) AS CHEQUE
            FROM VENTE V
        GROUP BY V.DateV ) VAgg
        FULL OUTER JOIN
        ( SELECT R.DateR,
                 sum(R.MontantR) AS REGLEMENT
            FROM REGLEMENT R
        GROUP BY R.DateR ) RAgg
          ON RAgg.DateR = VAgg.DateV
    ORDER BY
        coalesce(VAgg.DateV, RAgg.DateR) ASC;
     
    DATE_PAY  ESPECE      CHEQUE      REGLEMENT
    ---------- ----------- ----------- -----------
    01/01/2009 25          0           20
    02/01/2009 0           20          10
    03/01/2009 0           0           15
    04/01/2009 0           5           0
    Néanmoins je pense qu'il vous manque une table calendrier pour les jours, ce serait plus simple :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    With VENTE AS
    (
    select '01/01/2009' as DateV, 10 as MontantV, 'ESPECE' as Typ from dual union all
    select '01/01/2009'         , 15            , 'ESPECE'        from dual union all
    select '02/01/2009'         , 20            , 'CHEQUE'        from dual union all
    select '04/01/2009'         ,  5            , 'CHEQUE'        from dual
    ),
         REGLEMENT AS
    (
    select '01/01/2009' as DateR, 20 as MontantR from dual union all
    select '02/01/2009'         , 10             from dual union all
    select '03/01/2009'         , 15             from dual
    ),
         CALENDRIER AS
    (
    select '01/01/2009' as Jour from dual union all
    select '02/01/2009'         from dual union all
    select '03/01/2009'         from dual union all
    select '04/01/2009'         from dual union all
    select '05/01/2009'         from dual
    )
    SELECT
        C.Jour                           AS DATE_PAY,
        coalesce(VAgg.ESPECE, 0)         AS ESPECE,
        coalesce(VAgg.CHEQUE, 0)         AS CHEQUE,
        coalesce(RAgg.REGLEMENT, 0)      AS REGLEMENT
    FROM
        CALENDRIER C
        LEFT OUTER JOIN 
        ( SELECT V.DateV,
                 sum(case V.Typ when 'ESPECE' then V.MontantV else 0 end) AS ESPECE,
                 sum(case V.Typ when 'CHEQUE' then V.MontantV else 0 end) AS CHEQUE
            FROM VENTE V
        GROUP BY V.DateV ) VAgg
          ON VAgg.DateV = C.Jour
        LEFT OUTER JOIN
        ( SELECT R.DateR,
                 sum(R.MontantR) AS REGLEMENT
            FROM REGLEMENT R
        GROUP BY R.DateR ) RAgg
          ON RAgg.DateR = C.Jour
    ORDER BY
        C.Jour ASC;
     
    DATE_PAY  ESPECE      CHEQUE      REGLEMENT
    ---------- ----------- ----------- -----------
    01/01/2009 25          0           20
    02/01/2009 0           20          10
    03/01/2009 0           0           15
    04/01/2009 0           5           0
    05/01/2009 0           0           0

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    Précis, claire et nette Merci encore.

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

Discussions similaires

  1. Résultat requête avec jointure
    Par arthuro45 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 03/02/2010, 15h15
  2. requête avec jointure qui renvoie des résultats bizarres
    Par Canari74 dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 20/05/2008, 02h13
  3. Réponses: 12
    Dernier message: 23/05/2007, 10h37
  4. Réponses: 14
    Dernier message: 25/07/2006, 22h28
  5. résultat inattendu avec acCmdPrint
    Par stigma dans le forum Access
    Réponses: 3
    Dernier message: 25/03/2006, 21h51

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