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 :

Etat bimensuel sur l'année en cours


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de H.ile
    Profil pro
    Architecte de système d'information
    Inscrit en
    Janvier 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Janvier 2008
    Messages : 122
    Par défaut Etat bimensuel sur l'année en cours
    Aloha,

    Je cherche à produire un état de linéaire stocké dans ma base (une somme de longueur) sur les 12 derniers mois, par quinzaine et par utilisateur.

    J'ai quelque chose d'approchant avec la 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    SELECT ROUND (SUM (SDO_GEOM.SDO_LENGTH (E.GEOMETRY, 0.5)), 2)
              "LONGUEUR SAISIE",
           TO_CHAR (TO_DATE (APIC_CDATE), 'MM-YYYY') "MOIS/ANNEE",
           E.SAISIE_P,
           CASE WHEN TO_CHAR (TO_DATE (APIC_CDATE), 'DD') < 14 THEN '1ère quinzaine'
                 ELSE '2ème quinzaine' END
              "QUINZAINE",
           GROUPING_ID (
              CASE
                 WHEN TO_CHAR (TO_DATE (APIC_CDATE), 'DD') < 14 THEN '1ère quinzaine'
                 ELSE '2ème quinzaine'
              END,
              E.SAISIE_P,
              TO_CHAR (TO_DATE (APIC_CDATE), 'MM-YYYY'))
              ID, COUNT(GID)
      FROM E_TRONCO E
     WHERE FLOOR (MONTHS_BETWEEN (SYSTIMESTAMP, APIC_CDATE)) < 12
    GROUP BY ROLLUP (CASE
                        WHEN TO_CHAR (TO_DATE (APIC_CDATE), 'DD') < 14 THEN '1ère quinzaine'
                 ELSE '2ème quinzaine'
                     END,
                     E.SAISIE_P,
                     TO_CHAR (TO_DATE (APIC_CDATE), 'MM-YYYY'))
    ORDER BY SAISIE_P,
             TO_CHAR (TO_DATE (APIC_CDATE), 'MM-YYYY'),
             CASE
                WHEN TO_CHAR (TO_DATE (APIC_CDATE), 'DD') < 14 THEN '1ère quinzaine'
                 ELSE '2ème quinzaine'
             END
    Oui mais voilà, en cas d'absence de l'utilisateur sur une quinzaine, je n'ai pas de valeur nulle dans longueur saisie. Ma série est discontinue. Comment faire pour bien avoir, pour chacun des 12 derniers mois, chacun des utilisateurs, une valeur pour chacune des quinzaines ?

    D'avance, merci,

    PS. On peut utiliser TO_CHAR (TO_DATE (APIC_CDATE), 'W') < 3 à la place.

  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
    De quel type est la colonne APIC_CDATE ?
    Un conseil, créez-vous un calendrier.
    Vous pourrez l'utiliser comme métrique continue et attaquer votre table avec une jointure externe.

  3. #3
    Membre confirmé Avatar de H.ile
    Profil pro
    Architecte de système d'information
    Inscrit en
    Janvier 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Janvier 2008
    Messages : 122
    Par défaut
    APIC_CDATE est censé être une date. Mais je ne m'explique toujours pas pourquoi je dois faire :" TO_CHAR (TO_DATE (APIC_CDATE), 'DD') ".

    J'ai vu pour un calendrier, effectivement. Là je sèche pour créer une métrique pour chacun de mes utilisateurs (pas de table, ni de vue les référençant de façon claire :/). Mais là je ne vois pas comment vous pouvez m'aider. A part me dire si c'est bien ainsi qu'il faut unir les requêtes.
    En fait dois-je unir ma requête à (ma requête de calendrier simple * mes utilisateurs) ou dois-je procéder autrement ?

    Sans aucun doute quelque chose à base 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
    18
    SELECT 
      TRUNC(sysdate-ROWNUM,'IW') AS cod_sem,
     
      TO_NUMBER(TO_CHAR(sysdate-ROWNUM,'IW')) AS cod_sem_ann
     
    FROM all_objects 
    WHERE TRUNC(SYSDATE - ROWNUM,'DD')>= TO_DATE(&v_start_date_yyyymmdd,'YYYYMMDD')
    UNION ALL
    SELECT 
     
     
      TRUNC(SYSDATE+ROWNUM-1,'IW') AS cod_sem,
     
      TO_NUMBER(TO_CHAR(SYSDATE+ROWNUM-1,'IW')) AS cod_sem_ann
     
    FROM all_objects 
    WHERE TRUNC(SYSDATE + ROWNUM-1,'DD')<= TO_DATE(&v_end_date_YYYYMMDD,'YYYYMMDD')
    ORDER BY 1 ASC   ;
    Merci, en tous les cas, Waldar

  4. #4
    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
    Si APIC_CDATE est bien du type date, pas la peine de faire TO_DATE(APIC_CDATE), c'est inutile (voire faux).

    TO_CHAR comme son nom l'indique renvoie du texte, mais vous le comparez à des nombres. Préférez dans ce cas la fonction EXTRACT qui renvoie directement un numérique.

    Évitez aussi l'utilisation de fonctions sur des colonnes quand vous cherchez à gérer des constantes.

    Pour les utilisateurs, on va utiliser une jointure externe partitionnée.

    Je suppose que les utilisateurs c'est la colonne SAISIE_P.
    Je suppose que vous avez créé la table CALENDRIER.
    Je suppose enfin que la colonne APIC_CDATE ne contient pas d'heures / minutes / secondes.

    En compilant toutes ces informations, vous devriez pouvoir travailler à partir de cette 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
      SELECT COALESCE(ROUND (SUM (SDO_GEOM.SDO_LENGTH (E.GEOMETRY, 0.5)), 2), 0) as "LONGUEUR SAISIE"
           , TO_CHAR(C.CAL_JOUR, 'MM-YYYY') as "MOIS/ANNEE"
           , E.SAISIE_P
           , CASE
               WHEN EXTRACT(DAY FROM C.CAL_JOUR) < 14
               THEN '1ère quinzaine'
               ELSE '2ème quinzaine'
             END as "QUINZAINE"
           , GROUPING_ID (
             CASE
               WHEN EXTRACT(DAY FROM C.CAL_JOUR) < 14
               THEN '1ère quinzaine'
               ELSE '2ème quinzaine'
             END, E.SAISIE_P, TO_CHAR(C.CAL_JOUR, 'MM-YYYY')
                          ) as ID
           , COUNT(E.GID)
        FROM CALENDRIER C
             LEFT OUTER JOIN E_TRONCO E PARTITION BY (SAISIE_P)
               ON E.APIC_CDATE = C.CAL_JOUR
       WHERE C.CAL_JOUR BETWEEN ADD_MONTHS(TRUNC(SYSDATE)+1, -12) AND SYSDATE
    GROUP BY ROLLUP (
             CASE
               WHEN EXTRACT(DAY FROM C.CAL_JOUR) < 14
               THEN '1ère quinzaine'
               ELSE '2ème quinzaine'
             END, E.SAISIE_P, TO_CHAR(C.CAL_JOUR, 'MM-YYYY')
                    )
    ORDER BY E.SAISIE_P
           , TO_CHAR (C.CAL_JOUR, 'MM-YYYY')
           , CASE
               WHEN EXTRACT(DAY FROM C.CAL_JOUR) < 14
               THEN '1ère quinzaine'
               ELSE '2ème quinzaine'
             END;

  5. #5
    Membre confirmé Avatar de H.ile
    Profil pro
    Architecte de système d'information
    Inscrit en
    Janvier 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Janvier 2008
    Messages : 122
    Par défaut
    Merci pour ces précieux conseils.
    Après vérification, APIC_CDATE contient bien l'heure, j'ai donc tronqué au jour, mois année.
    J'ai préféré construire une vue CALENDRIER.
    En vous souhaitant à tous un bon week end s'il on ne se revoie pas d'ici là.

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

Discussions similaires

  1. [WD17] etat basé sur fenêtre en cours
    Par korriganLann dans le forum WinDev
    Réponses: 5
    Dernier message: 10/12/2012, 10h40
  2. Récupérer les dates de l'année en cours sur SQL Server
    Par And_res dans le forum Bases de données
    Réponses: 5
    Dernier message: 17/10/2008, 09h51
  3. Réponses: 2
    Dernier message: 10/05/2007, 17h07
  4. Réponses: 3
    Dernier message: 16/04/2007, 13h28
  5. Réponses: 16
    Dernier message: 29/04/2005, 14h39

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