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 Oracle Discussion :

[Ora9i] Mediane d'un ensemble calculé avec count contenant des enregistrements nulls


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 36
    Par défaut [Ora9i] Mediane d'un ensemble calculé avec count contenant des enregistrements nulls
    Bonjour,

    Je dois retourner la valeur médiane d'un nombre d'appel quotidien, avec des jours sans appels.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    DATE_APPEL           NOMBRE_APPEL
    ----------           ------------
    20/09/2008                     3
    21/09/2008                     5
    23/09/2008                     1
    La médiane du nombre d'appels du 20/09/2008 au 22/09/2008 inclus sera 3.
    La médiane du nombre d'appels du 21/09/2008 au 23/09/2008 inclus sera 1.
    La médiane du nombre d'appels du 20/09/2008 au 23/09/2008 inclus sera sauf erreur 2 (valeur du 20/09/2008 = 3 + valeur du 22/09/2008 = 1 le tout divisé par 2)..

    Je dispose d'une table statistique de la structure suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    create table STATISTIQUE  (
       ID_STATISTIQUE       NUMBER                           not null,
       ID_CLIENT            NUMBER(4),
       DATE_APPEL           DATE                             not null,
       METHODE_APPELEE      VARCHAR(15)                      not null,
       constraint PK_STATISTIQUE primary key (ID_STATISTIQUE)
    )
    Mon jeu de test est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ID_STATISTIQUE  ID_CLIENT  DATE_APPEL  METHODE_APPELEE 
    --------------  ---------  ----------  ---------------
    1               2          30/09/08    controle        
    2               2          30/09/08    controle        
    3               2          30/09/08    controle
    Ce qui doit donner avec WITH :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    WITH zTestMedianne AS (SELECT 1 ID_STATISTIQUE, to_date('2008-09-30','yyyy-mm-dd') date_appel, 2 ID_CLIENT, 'controle' METHODE_APPELEE FROM DUAL 
    UNION ALL SELECT 2 ID_STATISTIQUE, to_date('2008-09-30','yyyy-mm-dd') date_appel, 2 ID_CLIENT, 'controle' METHODE_APPELEE FROM DUAL 
    UNION ALL SELECT 3 ID_STATISTIQUE, to_date('2008-09-30','yyyy-mm-dd') date_appel, 2 ID_CLIENT, 'controle' METHODE_APPELEE FROM DUAL 
     )
    Je suis sous Oracle 9i.

    Voici la requête que j'ai tant bien que mal réussi à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select percentile_cont(0.5) within group (order by (count(date_appel)) NULLS FIRST) 
    over (partition by date_appel) MEDIANE
    from STATISTIQUE
    where id_client=2 and
    date_appel >= to_date('2008-09-30','yyyy-mm-dd') and date_appel <= to_date('2008-09-30','yyyy-mm-dd')
    group by date_appel;
    Cette requête me retourne 3.
    En changeant les dates pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select percentile_cont(0.5) within group (order by (count(date_appel)) NULLS FIRST) 
    over (partition by date_appel) MEDIANE
    from STATISTIQUE
    where id_client=2 and
    date_appel >= to_date('2008-09-20','yyyy-mm-dd') and date_appel <= to_date('2008-09-22','yyyy-mm-dd')
    group by date_appel;
    J'obtiens NULL.
    Par contre, lorsque je teste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select percentile_cont(0.5) within group (order by (count(date_appel)) NULLS FIRST) 
    over (partition by date_appel) MEDIANE
    from STATISTIQUE
    where id_client=2 and
    date_appel >= to_date('2008-09-28','yyyy-mm-dd') and date_appel <= to_date('2008-09-30','yyyy-mm-dd')
    group by date_appel;
    J'obtiens 3, au lieu de 0.

    Comment faire pour que les dates sans enregistrements dans la table soient pris en compte ?

    D'avance, merci.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 36
    Par défaut
    Ma question est mal formulée ou ma demande est impossible ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 36
    Par défaut
    Après plusieurs essais, je crois enfin tenir une solution...

    Si jamais quelqu'un trouve quelquechose de moins lourd, qu'il n'hésite pas...
    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 percentile_cont(0.5) within GROUP (ORDER BY COMPTAGE_UNIQUE NULLS FIRST)
    from
    (
    select distinct DATE_APPEL, sum(NOMBRE) COMPTAGE_UNIQUE
    from
    (
    select distinct date_appel DATE_APPEL,count(date_appel) NOMBRE
    from Statistique
    where date_appel >= to_date('2008-09-29','yyyy-mm-dd') and date_appel <= to_date('2008-09-30','yyyy-mm-dd') and id_client=2
    group by(date_appel) 
    union 
    select distinct to_date('2008-09-29','yyyy-mm-dd') + rownum -1 DATE_APPEL,0 NOMBRE
    from Statistique
    where rownum <= trunc(to_date('2008-09-30','yyyy-mm-dd'))-trunc(to_date('2008-09-29','yyyy-mm-dd')) + 1
    )
    group by DATE_APPEL
    )

Discussions similaires

  1. [AC-2003] Calcul avec donnée de l'enregistrement suivant
    Par yupyupxav dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 12/06/2009, 12h30
  2. Probléme avec requétes contenant des caractéres spéciaux
    Par dragonfly dans le forum Requêtes
    Réponses: 1
    Dernier message: 08/11/2007, 17h20
  3. Probleme avec COUNT() contenant une condition
    Par smarties dans le forum Requêtes
    Réponses: 1
    Dernier message: 26/07/2007, 10h19
  4. [SqlServer 2K] curseurs avec SELECT contenant des variables
    Par yinyang dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/07/2006, 10h25
  5. Import avec fichier contenant des guillemets
    Par Maximus06 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 18/07/2006, 12h07

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