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

PL/SQL Oracle Discussion :

Besoin d'aide DATES ORACLE


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Administrateur de base de données
    Inscrit en
    Juillet 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2006
    Messages : 98
    Par défaut Besoin d'aide DATES ORACLE
    Salut, je doit faire une requête qui fera un rapport du genre :

    Semaine 1 : x résultats du type v
    Semaine 1 : x résultats du type y
    Semaine 1 : x résultats du type w
    Semaine 2 : x résultats du type v
    Semaine 2 : x résultats du type y
    Semaine 2 : x résultats du type w
    Semaine 3 : x résultats du type v
    Semaine 3 : x résultats du type y
    Semaine 3 : x résultats du type w
    Semaine 4 : x résultats du type v
    Semaine 4 : x résultats du type y
    Semaine 4 : x résultats du type w
    ....


    Le problème est que je fait ma requête à partir des type v,y et w et non à partir du temps.

    Donc il se peut que je n'est aucun résultat pour par exemple Semaine 4 : x résultats du type y.

    J'ai besoin d'avoir l'enregistrement et un 0 pour le count.

    Voici un exemple de ma requête :

    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
     
    SELECT   TEMPS, PETY_DESC, SUM (COUNT) "COUNT"
        FROM (SELECT TO_CHAR (PEIN_CREATION, 'IYYY-IW') "TEMPS",
                     CASE
                        WHEN PERM_PETY_ID IN (3, 4)
                           THEN 'Désistement'
                        WHEN PERM_PETY_ID IN (1, 2)
                           THEN 'Consentements'
                     END "PETY_DESC",
                     COUNT (*) "COUNT"
                FROM PEIN, PERM
               WHERE PERM_ID = PEIN_PERM_ID
                 AND TO_CHAR (PEIN_CREATION, 'YYYY-MM-DD') >= '2009-10-01'
                 AND TO_CHAR (PEIN_CREATION, 'YYYY-MM-DD') <= '2010-01-19'
                 GROUP BY PEIN_CREATION, PERM_PETY_ID)
    GROUP BY TEMPS, PETY_DESC
    Le résultat que je voudrais serait du genre :
    TEMPS PETY_DESC COUNT

    2009-51 Désistement 5299
    2009-51 Consentements 798
    2009-52 Désistement 2901
    2009-52 Consentements 526


    Mais présentement, si j'ai aucun résultat pour la semaine 51 du type "consentements", ça me donne :

    TEMPS PETY_DESC COUNT

    2009-51 Désistement 5299
    2009-52 Désistement 2901
    2009-52 Consentements 526


    J'ai besoin de la ligne
    2009-51 Consentements 0

    Quelqu'un a une idée?? Du genre partir la requête sur une plage de temps au lieu du type d'information?

    Du genre pour tout les semaines entre telle date et telle date, trouve moi les counts pour chaque type...

    Merci de votre aide...Je suis dans le ....

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Vous n'avez pas besoin de faire votre requête en deux étapes, si vous faisiez le group by sur les éléments de la sélection vous économiseriez le calcul de la somme.

    De même, vous avez une colonne au format date, pourquoi la convertir en texte pour la comparer à des constantes ?
    C'est beaucoup moins coûteux de convertir vos constantes en date.

    Pour votre problème, il suffit de rajouter en jointure les éléments 1 à 4.
    Ça donnerait quelque chose comme :
    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
    WITH SR AS
    (
    SELECT 1 as FULL_ID FROM DUAL UNION ALL 
    SELECT 2            FROM DUAL UNION ALL 
    SELECT 3            FROM DUAL UNION ALL 
    SELECT 4            FROM DUAL
    )
    SELECT
        TO_CHAR(pe.PEIN_CREATION, 'IYYY-IW') as temps,
        CASE
          WHEN sr.FULL_ID IN (3, 4) THEN 'Désistement'
          WHEN sr.FULL_ID IN (1, 2) THEN 'Consentements'
        END as PETY_DESC,
        COUNT(*) as count
    FROM
        PEIN pe
        INNER JOIN PERM pr
          ON pr.PERM_ID = pe.PEIN_PERM_ID
        RIGHT OUTER JOIN SR
          on sr.FULL_ID = pr.PERM_PETY_ID
    WHERE
        pe.PEIN_CREATION >= date '2009-10-01'
    AND pe.PEIN_CREATION <= date '2010-01-19'
    GROUP BY
        TO_CHAR(PEIN_CREATION, 'IYYY-IW'),
        CASE
          WHEN sr.FULL_ID IN (3, 4) THEN 'Désistement'
          WHEN sr.FULL_ID IN (1, 2) THEN 'Consentements'
        END;
    D'ailleurs après réflexion ça pourrait ne pas marcher.

    Il vous faut également une table calendrier, et l'utiliser en jointure externe.

    Si vous faites une jointure externe partitionnée vous n'aurez pas besoin du rajout que je viens de proposer ci-dessus :
    http://download.oracle.com/docs/cd/B...2.htm#i2177515

  3. #3
    Membre confirmé
    Administrateur de base de données
    Inscrit en
    Juillet 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2006
    Messages : 98
    Par défaut
    Merci, j'étais justement en train de regarder pour une table calendrier.

    Une temp table ferait le travail.

    Merci!

  4. #4
    Membre confirmé
    Administrateur de base de données
    Inscrit en
    Juillet 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2006
    Messages : 98
    Par défaut
    Que penses-tu de ça :

    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
     
    SELECT   TEMPS, PETY_DESC, SUM (COUNT)
        FROM (SELECT TO_CHAR (DATE_PERIODE, 'IYYY-IW') "TEMPS",
                     CASE
                        WHEN PERM_PETY_ID IN (3, 4)
                           THEN 'Désistement'
                        WHEN PERM_PETY_ID IN (1, 2)
                           THEN 'Consentements'
                     END "PETY_DESC",
                     (SELECT COUNT (*)
                        FROM PEIN
                       WHERE TRUNC (PEIN.PEIN_CREATION) = PER.DATE_PERIODE
                         AND PEIN_CREATION >= '2010-02-01'
                         AND PEIN_CREATION <= '2010-04-17') "COUNT"
                FROM DATES_PERIODE PER, PERMISSION.PERM)
    GROUP BY TEMPS, PETY_DESC
    où la table DATES_PERIODE est une table temporaire qui possède un seul champ date et qui est remplit avec tout les dates entre le 2010-02-01 et le 2010-04-17 avant d'exécuter la requête.

    Je crois que je n'avais pas le choix de faire un select à deux niveaux pour faire fonctionner mon group by.

    Est-ce performant ??

    A+

    Et merci encore

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Non c'est pas terrible.
    Il n'y a pas besoin de table temporaire, soit vous faites une table calendrier en dur, soit vous en faites une au moment de l'exécution de votre requête.

    Je vous réinvite à passer par une jointure externe partitionnée.
    Que donne la requête suivante (syntaxe peut-être à adapter) :
    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
    With Calendar AS
    (
    select date '2010-02-01' + level - 1 as Jour
      from dual
    connect by level -1 <= date '2010-04-17' - date '2010-02-01'
    )
    SELECT
        TO_CHAR(pe.PEIN_CREATION, 'IYYY-IW') AS temps,
        CASE
          WHEN pr.PERM_PETY_ID IN (3, 4) THEN 'Désistement'
          WHEN pr.PERM_PETY_ID IN (1, 2) THEN 'Consentements'
        END AS PETY_DESC,
        COUNT(*) AS count
    FROM
        PEIN pe
        INNER JOIN PERMISSION.PERM pr
          ON pr.PERM_ID = pe.PEIN_PERM_ID
          PARTITION BY (CASE
                          WHEN pr.PERM_PETY_ID IN (3, 4) THEN 'Désistement'
                          WHEN pr.PERM_PETY_ID IN (1, 2) THEN 'Consentements'
                        END)
        RIGHT OUTER JOIN Calendar ca
          ON ca.jour = trunc(pe.PEIN_CREATION)
    GROUP BY
        TO_CHAR(PEIN_CREATION, 'IYYY-IW'),
        CASE
          WHEN pr.PERM_PETY_ID IN (3, 4) THEN 'Désistement'
          WHEN pr.PERM_PETY_ID IN (1, 2) THEN 'Consentements'
        END;

Discussions similaires

  1. Besoin d'aide avec Oracle Forms 10g
    Par beben1 dans le forum Forms
    Réponses: 1
    Dernier message: 22/09/2014, 10h35
  2. Réponses: 2
    Dernier message: 16/01/2009, 15h50
  3. Besoin d'aide avec oracle database 10g
    Par air dans le forum Oracle
    Réponses: 1
    Dernier message: 16/10/2005, 06h43
  4. Création requete besoin d'aide pour une date
    Par royrremi dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 14/07/2004, 22h03

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