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

SQL Firebird Discussion :

full outer join


Sujet :

SQL Firebird

  1. #1
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 246
    Par défaut full outer join
    bonjour, je dois ecrire une requete qui va chercher des cumul de ventes dans une table, ainsi que les cumul de l'année passé, regroupé par reference article et par mois.
    Ma requete fonctionne tant que des ventes sont présente et dans le mois de l'année N et dans le mois de l'année n-1.

    j'aimerais que dans des cas ou il n'y a pas eu de vente dans le mois de l'année N ou dans le mois ou de l'année N-1 il affiche quand meme les données qu'il possede (je sais pas si je suis tres clair..)
    j'ai pensé a mettre un full outer join mais sans succès.

    voici ce que j'ai ecris :
    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  t_cumulca.mois,t_cumulca.cumulqte,
     t_cumulca.cumulht, sum(t_cumulca.cumulqte) as cumulqant,
     sum(t_cumulca.cumulht) as cumulchif, 
    anpass.cumulqte, anpass.cumulht,
     sum(anpass.cumulqte) as sumteanpass,
     sum(anpass.cumulht) as sumanpasscumulht
     
     from t_cumulca full outer join t_cumulca as anpass on 
    (t_cumulca.refarticle =  anpass.refarticle and
     t_cumulca.mois = anpass.mois)
     
     where t_cumulca.refarticle = '10204040' 
     and t_cumulca.annee = 2009 and
     anpass.annee = 2008
     
     group by   t_cumulca.mois, t_cumulca.cumulqte, 
    t_cumulca.cumulht, anpass.cumulqte,
     anpass.cumulht

  2. #2
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut
    Salut

    Un LEFT OUTER JOIN devrait faire l'affaire. Essaye 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    SELECT
      T_CUMULCA.MOIS,
      T_CUMULCA.CUMULQTE,
      T_CUMULCA.CUMULHT,
      SUM(T_CUMULCA.CUMULQTE) AS CUMULQANT,
      SUM(T_CUMULCA.CUMULHT) AS CUMULCHIF,
      ANPASS.CUMULQTE,
      ANPASS.CUMULHT,
      SUM(COALESCE(ANPASS.CUMULQTE, 0)) AS SUMTEANPASS,
      SUM(COALESCE(ANPASS.CUMULHT, 0)) AS SUMANPASSCUMULHT
    FROM
      T_CUMULCA LEFT OUTER JOIN T_CUMULCA AS ANPASS
      ON
        T_CUMULCA.REFARTICLE =  ANPASS.REFARTICLE AND
        T_CUMULCA.MOIS = ANPASS.MOIS
    WHERE
      T_CUMULCA.REFARTICLE = '10204040' AND
      T_CUMULCA.ANNEE = 2009 AND
      ANPASS.ANNEE = 2008
    GROUP BY
      T_CUMULCA.MOIS,
      T_CUMULCA.CUMULQTE,
      T_CUMULCA.CUMULHT,
      ANPASS.CUMULQTE,
      ANPASS.CUMULHT
    @+ Claudius

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 246
    Par défaut
    hélas cela ne me renvoi aucun résultat.

    pour faire mon test je rentre des entrés pour un produit en octobre 2009 et d'autre en décembre 2008

    j'aimerais que la requête me renvoie les entrées avec
    pour octobre 2009 les valeur de l'année et vide pour l'année précédente

    et décembre vide pour l'année en cours et les données pour 2008.

    voici ma table :

    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
    /******************************************************************************/
    /*            Generated by IBExpert 2009.06.15 15/12/2009 18:06:16            */
    /******************************************************************************/
     
    SET SQL DIALECT 3;
     
    SET NAMES NONE;
     
    SET CLIENTLIB 'C:\Program Files\Firebird\Firebird_2_1\bin\fbclient.dll';
     
    CONNECT '';
     
     
     
    /******************************************************************************/
    /*                                   Tables                                   */
    /******************************************************************************/
     
     
     
    CREATE TABLE T_CUMULCA (
        REFARTICLE   VARCHAR(15),
        TAILLE       VARCHAR(2),
        CUMULQTE     NUMERIC(12,2),
        CUMULHT      NUMERIC(12,2),
        MOIS         VARCHAR(2) NOT NULL,
        ANNEE        VARCHAR(4),
        STKMINIFINI  INTEGER,
        STKMINIBRUT  INTEGER
    );
     
     
    COMMIT WORK;
    je n'ai encore mis aucune cléf de type autonum, peu etre est ce mon defaut à ce stade.

  4. #4
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut
    Oups je n'avais pas remarqué que tu faisais une jointure sur la même table.

    Puisque tu es sous IBExpert que tu peux m'extraire un jeu de données exemple, que je puisse faire quelques tests. Peu de lignes suffiront.

    @+

  5. #5
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 246
    Par défaut
    voila ce que j'ai pour mon test :
    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
    /******************************************************************************/
    /*            Generated by IBExpert 2009.06.15 15/12/2009 18:17:32            */
    /******************************************************************************/
     
    SET SQL DIALECT 3;
     
    SET NAMES NONE;
     
    SET CLIENTLIB 'C:\Program Files\Firebird\Firebird_2_1\bin\fbclient.dll';
     
    CONNECT '';
     
    INSERT INTO T_CUMULCA (REFARTICLE, TAILLE, CUMULQTE, CUMULHT, MOIS, ANNEE, STKMINIFINI, STKMINIBRUT) VALUES ('10204040', NULL, 12, 18.48, '12', '2008', 0, 0);
    INSERT INTO T_CUMULCA (REFARTICLE, TAILLE, CUMULQTE, CUMULHT, MOIS, ANNEE, STKMINIFINI, STKMINIBRUT) VALUES ('10204040', NULL, 6, 9.24, '10', '2009', 0, 0);
    INSERT INTO T_CUMULCA (REFARTICLE, TAILLE, CUMULQTE, CUMULHT, MOIS, ANNEE, STKMINIFINI, STKMINIBRUT) VALUES ('10204045', NULL, 6, 10.62, '10', '2009', NULL, NULL);
     
    COMMIT WORK;
     
    COMMIT WORK;

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 719
    Billets dans le blog
    65
    Par défaut
    Sauf par procedure , je ne vois pas vraiment comment on pourrait trouver des mois inexistants !

    Pourtant il me semble avoir vu quelque chose de ce genre dans un des tutos de SQLPro , si je le retrouve je mets le lien

    [Edit] j'avais bien vu , Alzheimer est encore loin , Il m'aura fallu moins de 5Mn pour retrouver le topic , le chapitre 3.3 doit pouvoir répondre a ton problème

    http://sqlpro.developpez.com/cours/gestiontemps/#L3.3.3

  7. #7
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 246
    Par défaut
    merci beaucoup je regarde ca et je vous tiens au courant

    edit : je ne travaille pas avec un champs date. mon probleme de plus est sur la lecture et pas l ajout de données.
    un exemple :
    un produit creer cette annee et qui n a donc aucune entree pour n-1 n apparaittra pas.

  8. #8
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut
    Re,

    Et ça qu'est-ce ça donne:
    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
    WITH
      AN_CUR AS (
        SELECT
          MOIS,
          SUM(CUMULQTE) QTE,
          SUM(CUMULHT) HT
        FROM
          T_CUMULCA
        WHERE
          ANNEE = 2009 AND
          REFARTICLE = :REF_ART
        GROUP BY
          1
      ),
     
      AN_PREC AS (
        SELECT
          MOIS,
          SUM(CUMULQTE) QTE,
          SUM(CUMULHT) HT
        FROM
          T_CUMULCA
        WHERE
          ANNEE = 2008  AND
          REFARTICLE = :REF_ART
        GROUP BY
          1
       )
     
    SELECT
      AN_CUR.MOIS,
      COALESCE(AN_CUR.QTE, 0) QTE,
      COALESCE(AN_CUR.HT, 0) HT,
      AN_PREC.MOIS MOIS_PREC,
      COALESCE(AN_PREC.QTE, 0) QTE_PREC,
      COALESCE(AN_PREC.HT, 0) HT_PREC
    FROM
      AN_CUR FULL OUTER JOIN AN_PREC
      ON AN_CUR.MOIS = AN_PREC.MOIS;
    @+

  9. #9
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 246
    Par défaut
    Bah ça ça donne exactement ce qu'il me fait .

    J'ai tester en modifiant le mois de decembre 2008 en octobre 2008 et j'ai bien une seule ligne, quand je laisse décembre j'ai bien 2 ligne à moitié rempli.


    merci beaucoup !

  10. #10
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut
    Citation Envoyé par eldrad95 Voir le message
    merci beaucoup !

  11. #11
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 246
    Par défaut
    derniere petite question sur cette requete .

    Si je mets dans le dernier select

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    coalesce (AN_CUR.MOIS,AN_PREC.mois) MOIS,
    et que je retire l'allusion à an_prec.mois dans la suite. j'arrive à un tableau qui me semble correct (un seul champs mois), mais est ce dangereux ? puis je me retrouver avec des erreurs ?

  12. #12
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut
    Citation Envoyé par eldrad95 Voir le message
    ... mais est ce dangereux ? puis je me retrouver avec des erreurs ?
    Non c'est parfaitement correct. Testé et vérifié.

  13. #13
    Membre Expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    Re,

    Et ça qu'est-ce ça donne:
    [code]WITH ...
    tu deviens un pro des CTE

  14. #14
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 246
    Par défaut
    super,

    Bah un grand merci pour avoir répondu aussi vite.

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

Discussions similaires

  1. L'équivalent de FULL OUTER JOIN sous ACCESS
    Par Le Pharaon dans le forum Langage SQL
    Réponses: 2
    Dernier message: 24/03/2013, 13h36
  2. Erreur FULL OUTER JOIN
    Par SwiTz dans le forum Requêtes
    Réponses: 14
    Dernier message: 02/04/2009, 14h33
  3. [Oracle 9] Probleme. FULL OUTER JOIN
    Par West01 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 17/10/2006, 08h46
  4. [ORACLE 9i] Equivalent du Full Outer Join
    Par Worldofdada dans le forum Oracle
    Réponses: 10
    Dernier message: 02/11/2005, 15h56
  5. Remplacer FULL OUTER JOIN
    Par funrighd dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/07/2004, 11h54

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