Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/02/2012, 17h33   #1
Nouveau Membre du Club
 
Avatar de H.ile
 
Architecte de système d'information
Inscription : janvier 2008
Messages : 107
Détails du profil
Informations personnelles :
Âge : 32
Localisation : Macao

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

Informations forums :
Inscription : janvier 2008
Messages : 107
Points : 37
Points : 37
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 :
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.
H.ile est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2012, 17h54   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 442
Points : 10 442
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
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.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/02/2012, 18h00   #3
Nouveau Membre du Club
 
Avatar de H.ile
 
Architecte de système d'information
Inscription : janvier 2008
Messages : 107
Détails du profil
Informations personnelles :
Âge : 32
Localisation : Macao

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

Informations forums :
Inscription : janvier 2008
Messages : 107
Points : 37
Points : 37
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 :
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
H.ile est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2012, 19h00   #4
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 442
Points : 10 442
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
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 :
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;
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 11h09   #5
Nouveau Membre du Club
 
Avatar de H.ile
 
Architecte de système d'information
Inscription : janvier 2008
Messages : 107
Détails du profil
Informations personnelles :
Âge : 32
Localisation : Macao

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

Informations forums :
Inscription : janvier 2008
Messages : 107
Points : 37
Points : 37
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à.
H.ile est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h36.


 
 
 
 
Partenaires

Hébergement Web