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

Oracle Discussion :

Problème de champs vierge dans un regroupement


Sujet :

Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 11
    Points : 5
    Points
    5
    Par défaut Problème de champs vierge dans un regroupement
    Voilà je dois faire un regroupement par evenements, mais quand l'un deux est egal à zéro ou vierge il n'est pas pris en compte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    select(
    CASE
        when t.sstypeevt='AGRE01' then 'Agression'
        when t.sstypeevt='INCE01' then 'Poubelle'
        when t.sstypeevt='TROU03' then 'Nuis.2 roues'
    END)as evt,count(*)
    from polville.obsesecu t
    where to_char(t.dtobs,'MMYYYY')='012004'
    group by t.sstypeevt

    Ici tout va bien, sauf que le champ TROU03 n'apparait pas, car sa valeur est egal à zéro. J'aimerai qu'il apparaisse


    PS: pendant que j'y suis, il y aurai pas un moyen de faire un classement par evenements et par mois ?

  2. #2
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    L'idéal serait d'avoir une table de nomenclature pour les sstypeevt et de faire une jointure externe avec la table OBSESECU, qqchose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select   a.lib, count(b.sstypeevt)
    from     REF_EVT a, POLVILLE.OBSESECU b
    where    a.sstypeevt = b.sstypeevt (+) and 
             (b.dtobs is null or to_char(t.dtobs,'MMYYYY') = '012004')
    group by a.lib
    Si tu n'as de table de nomenclature tu peux faire :
    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   a.lib, count(b.sstypeevt)
    from     (
                select distinct 
                   sstypeevt,
                   case
                      when t.sstypeevt='AGRE01' then 'Agression' 
                      when t.sstypeevt='INCE01' then 'Poubelle' 
                      when t.sstypeevt='TROU03' then 'Nuis.2 roues' 
                   end lib
                from                         
                   POLVILLE.OBSESECU
             ) a, 
             POLVILLE.OBSESECU b
    where    a.sstypeevt = b.sstypeevt (+) and 
             (b.dtobs is null or to_char(t.dtobs,'MMYYYY') = '012004' )
    group by a.lib
    Mais ca risque d'être bcp moins performant.

    Si tu veux aussi un compte par mois, tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select   a.lib, to_char(b.dtobs,'MMYYYY'),
             count(b.sstypeevt)
    from     REF_EVT a, POLVILLE.OBSESECU b
    where    a.sstypeevt = b.sstypeevt (+) 
    group by a.lib, to_char(b.dtobs,'MMYYYY')

    Laly.


    EDIT : j'ai rajouté des parenthèses au niveau du OR
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  3. #3
    Futur Membre du Club
    Inscrit en
    Novembre 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Merci de ton aide, mais j'ai pas tout compris. J'ai surtout des notions en sql
    Genre a quoi correspond ton : a.lib ?


    Sinon j'ai toujours le probleme du champ TROU03 qui apres un count reste a zéro et n'apparait pas dans le resultat

  4. #4
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Dans ma table de nomenclature, j'avais supposé comme structure :

    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
     
    SQL> desc REF_EVT;
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     SSTYPEEVT                                          VARCHAR2(100)
     LIB                                                VARCHAR2(100)
     
    SQL> select * from REF_EVT;
    SQL> /
     
    SSTYPEEVT       LIB
    --------------- ---------------
    AGRE01          Agression
    INCE01          Poubelle
    TROU03          Nuis.2 roues

    Sur mon exemple simplifié ca marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SQL> l
      1  select   a.lib, count(b.sstypeevt)
      2  from     REF_EVT a, OBSESECU b
      3  where    a.sstypeevt = b.sstypeevt (+)
      4* group by a.lib
    SQL> /
     
    LIB             COUNT(B.SSTYPEEVT)
    --------------- ------------------
    Agression                        1
    Nuis.2 roues                     0
    Poubelle                         1
    Tu peux poster ta requête qui marche pas ?


    Laly.


    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  5. #5
    Futur Membre du Club
    Inscrit en
    Novembre 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Ben ma requete elle est dans mon 1er post. j'ai qu'une seule est unique table qui comporte de nombreux champs, dont :

    - Dtobs = la date
    - Typeevt = evenement ( AGRE,INCE,TROU) - Varchar
    - sstypeevt = sous evenement ( AGRE01-02-03,INCE01-02-03,TROU01-02-03-04) - varchar

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    select count(*),(
    CASE
        when t.sstypeevt='AGRE01' then 'Agression'
        when t.sstypeevt='CAMB01' then 'Cambriolage'
        when t.sstypeevt='INCE01' then 'Poubelle'
        when t.sstypeevt='TROU02' then 'Rassemblement'
        when t.sstypeevt='TROU03' then 'Nuis.2 roues'
        when t.sstypeevt='TROU04' then 'Autres'
    END) as evts
    from polville.obsesecu t
    where to_char(t.dtobs,'MMYYYY')='012004'
    group by t.sstypeevt
    Et le resultat

    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
     
    1	23	Agression
    2	15	
    3	8	
    4	74	Cambriolage
    5	68	
    6	2	
    7	2	
    8	2	
    9	13	Poubelle
    10	6	
    11	7	
    12	19	
    13	13	Rassemblement
    14	27	Autres
    Il y a des champs sans nom car je n'ai pas tout ecrit, c'est un test

  6. #6
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Ce qui est bizarre c'est que ta requête retourne deux champs alors qu'à la sortie tu en as 3 (où alors je suis mal réveillé).

    Tu peux me donner la sortie sous SQL*Plus de :

    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
     
    select   a.lib, count(b.sstypeevt) 
    from     ( 
                select distinct 
                   sstypeevt, 
                   case 
                      when t.sstypeevt='AGRE01' then 'Agression' 
                      when t.sstypeevt='INCE01' then 'Poubelle' 
                      when t.sstypeevt='TROU03' then 'Nuis.2 roues' 
                   end lib 
                from                          
                   POLVILLE.OBSESECU 
             ) a, 
             POLVILLE.OBSESECU b 
    where    a.sstypeevt = b.sstypeevt (+) and 
             (b.dtobs is null or to_char(t.dtobs,'MMYYYY') = '012004' ) 
    group by a.lib

    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  7. #7
    Futur Membre du Club
    Inscrit en
    Novembre 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Ca sort 3 colonnes car j'ai fait un copier/coller sous PL/SQL, la 1ere colonne n'a pas de rapport avec la requete

    Sinon dans ta requete de base ca me sort erreur colonne nom valide, j'ai donc change un peu, j'espere ne pas m'etre trompe :

    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
     
    select   a.lib, count(b.sstypeevt)
    from     (
                select distinct
                   sstypeevt,
                   case
                      when t.sstypeevt='AGRE01' then 'Agression'
                      when t.sstypeevt='INCE01' then 'Poubelle'
                      when t.sstypeevt='TROU03' then 'Nuis.2 roues'
                   end lib
                from                         
                   POLVILLE.OBSESECU t
             ) a,
             POLVILLE.OBSESECU b
    where    a.sstypeevt = b.sstypeevt (+) and
             (b.dtobs is null or to_char(b.dtobs,'MMYYYY') = '012004' )
    group by a.lib

    et ca me donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Agression	23
    Poubelle	13
    	       243

  8. #8
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Comme tu n'as pas de table de nomenclature, TROU3 n'apparait pas et c'est donc normal qu'il ne soit pas restitué


    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  9. #9
    Futur Membre du Club
    Inscrit en
    Novembre 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Ok

    Car je dois effectuer cette requete dans excel, pour en faire un tableau de stats avec graph, mais bon j'aurai aime faire ca par mois directement , sinon je vais devoir faire ca case par case et pour chaque mois

    merci quand même de ton aide

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 15/06/2011, 11h26
  2. [AC-2007] Problème de champ calulé dans sous-formulaire
    Par hyperion13 dans le forum VBA Access
    Réponses: 8
    Dernier message: 23/04/2010, 12h44
  3. [AC-2007] Problème avec champs concaténé dans 1 formulaire
    Par Peter K. dans le forum VBA Access
    Réponses: 4
    Dernier message: 21/08/2009, 17h09
  4. Problème de champ vide dans une base sql
    Par lionel256 dans le forum VB.NET
    Réponses: 13
    Dernier message: 16/04/2008, 17h07
  5. Réponses: 3
    Dernier message: 03/08/2007, 21h11

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