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 :

Jointure : où sont mes mois?


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 10
    Points : 9
    Points
    9
    Par défaut Jointure : où sont mes mois?
    Bonjour à tous!

    J'ai un petit souci de jointure et je fais appel à la collectivité pour m'aclairer un petit peu.

    Le contexte est le suivant :
    Je possède une vue de structure suivante :
    ID (int) - DATE (datetime) - CATEGORIE (varchar) - SOUS-CATEGORIE (varchar) - VALEUR (float)

    A partir de cette vue, je voudrais en créer une autre qui me permettrait d'avoir au minimum une valeur par CATEGORIE / SOUS-CATEGORIE par mois/année. Naïvement je me dis qu'en créant une table temporaire avec mes 12 mois je pourrais, via une jointure externe et je ne sais quels artifices, obtenir le résultat recherché, mais je ne vois pas comment...

    Merci pour tout conseil que vous pourrez me donner sur le sujet!
    Romain

    Exemple:

    ID DATE CATEGORIE SOUS-CATEGORIE VALEUR
    1 01/01/2006 CAT1 S-CAT1 10
    2 05/01/2006 CAT1 S-CAT2 15
    3 27/02/2006 CAT1 S-CAT1 20
    4 05/05/2006 CAT1 S-CAT1 10
    5 10/09/2006 CAT1 S-CAT2 50
    6 19/09/2006 CAT1 S-CAT2 10
    etc...

    Qui me donnerais:

    ANNEE MOIS CATEGORIE SOUS-CATEGORIE VALEUR
    2006 01 CAT1 S-CAT1 10
    2006 02 CAT1 S-CAT1 20
    2006 03 CAT1 S-CAT1 0
    2006 04 CAT1 S-CAT1 0
    2006 05 CAT1 S-CAT1 10
    2006 06 CAT1 S-CAT1 0
    2006 07 CAT1 S-CAT1 0
    2006 08 CAT1 S-CAT1 0
    2006 09 CAT1 S-CAT1 0
    2006 10 CAT1 S-CAT1 0
    2006 11 CAT1 S-CAT1 0
    2006 12 CAT1 S-CAT1 0
    2006 01 CAT1 S-CAT2 15
    2006 02 CAT1 S-CAT2 0
    2006 03 CAT1 S-CAT2 0
    2006 04 CAT1 S-CAT2 0
    2006 05 CAT1 S-CAT2 0
    2006 06 CAT1 S-CAT2 0
    2006 07 CAT1 S-CAT2 0
    2006 08 CAT1 S-CAT2 0
    2006 09 CAT1 S-CAT2 50 (possibilité de group by si plus simple?)
    2006 09 CAT1 S-CAT2 10 (possibilité de group by si plus simple?)
    2006 10 CAT1 S-CAT2 0
    2006 11 CAT1 S-CAT2 0
    2006 12 CAT1 S-CAT2 0

    NB: mon exemple s'échelonne sur 2006 mais les données peuvent s'étaler sur plusieurs années.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 099
    Points : 28 390
    Points
    28 390
    Par défaut
    Tu as besoin en effet d'une table des mois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create table MOIS
        (    MOIS    byteint
        ,    ANNEE    smallint
        )
    ;
    Il te faut aussi la liste des categories - sous-categories :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select    C.CATEGORIE
        ,    C.SOUS_CATEGORIE
    from    MATABLE    as C
    group by
            C.CATEGORIE
        ,    C.SOUS_CATEGORIE
    ;
    Ensuite, il ne reste plus qu'à croiser les deux et y ajouter les montants...
    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
    select    M.ANNEE
        ,    M.MOIS
        ,    H.CATEGORIE
        ,    H.SOUS_CATEGORIE
        ,    sum(V.VALEUR) as TOTAL
    from
        (    MOIS    as M
        cross join
            (    select    C.CATEGORIE
                    ,    C.SOUS_CATEGORIE
                from    MATABLE    as C
                group by
                        C.CATEGORIE
                    ,    C.SOUS_CATEGORIE
            )    as H
        )
        left join
            MATABLE    as V
            on    H.CATEGORIE = V.CATEGORIE
            and    H.SOUS_CATEGORIE = V.SOUS_CATEGORIE
            and    M.ANNEE    = extract(year from V.DATE)
            and    M.MOIS    = extract(month from V.DATE)
    group by
            M.ANNEE
        ,    M.MOIS
        ,    H.CATEGORIE
        ,    H.SOUS_CATEGORIE
    ;
    Attention : DATE est un mot clé de SQL et ne devrait pas être utilisé comme nom d'objet, afin de ne pas avoir de surprise...

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Merci beaucoup Alain!

    Je n'avais pas saisi le coup de la CROSS TABLE ... pauvre de moi

    Donc en gros, il me reste à remplir ma table "MOIS" avec tous les mois des années existantes dans ma table, et ça devrait aller.

    Je vérifie actuellement les résultats (en croisant mes doigts trèès fort).

    Romain

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

Discussions similaires

  1. Ou sont mes enregistrements à partir de 8126 ?
    Par AIexis dans le forum Requêtes
    Réponses: 7
    Dernier message: 30/01/2006, 14h03
  2. [VB.net] Où sont mes contrôles ?
    Par waici dans le forum Windows Forms
    Réponses: 2
    Dernier message: 13/01/2006, 09h15
  3. [MFC] Ou sont mes boutons de toolbar?
    Par foxblue dans le forum MFC
    Réponses: 3
    Dernier message: 08/09/2005, 14h42
  4. URPMI - Où sont mes programmes ?
    Par Dnx dans le forum Mandriva / Mageia
    Réponses: 2
    Dernier message: 25/09/2004, 21h57

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