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 23/09/2011, 12h10   #1
Membre chevronné
 
Avatar de nathieb
 
Homme olivier Thiébaut
Chef de projet/Architecte
Inscription : mai 2004
Messages : 626
Détails du profil
Informations personnelles :
Nom : Homme olivier Thiébaut
Âge : 45
Localisation : France

Informations professionnelles :
Activité : Chef de projet/Architecte
Secteur : Service public

Informations forums :
Inscription : mai 2004
Messages : 626
Points : 704
Points : 704
Par défaut INTERVAL ET SOUS select

Bonjour,

Pour les besoins d'une appli on crée une vue en fonction des date
Année N ou année N-1 = f(du mois de l'année)

avant ... statique on avait que N-1
Code :
1
2
3
4
5
6
7
 
CREATE OR REPLACE FORCE VIEW AS 
SELECT 
..
FROM 
...
WHERE (DATE_OUVERTURE IS NULL OR DATE_OUVERTURE <= TO_DATE('3112'||TO_CHAR((sysdate - INTERVAL '1' YEAR),'YYYY'),'DDMMYYYY'))
cette vue fonctionne bien, mais je dois inclure une condition suplémentaire sur le fameux
décalage en fonction du mois de l'année
Avec un decode, je génére 1 ou 0
Code :
1
2
 
SELECT decode(sign(TO_NUMBER(TO_CHAR(sysdate -INTERVAL '1' MONTH ,'MM')-8 )),-1,1,0,1,1,0) FROM DUAL
Cela fonctionne aussi, mais il y a un hic quand je remplace le
INTERVAL '1' de la première requête par la deuxième
Code :
1
2
3
4
 
par  INTERVAL (
SELECT decode(sign(TO_NUMBER(TO_CHAR(sysdate -INTERVAL '1' MONTH ,'MM')-8 )),-1,1,0,1,1,0) FROM DUAL
)
Est ce possible ???

Olivier
__________________
Architecte déstructurant,
be cool, be free

J2EE - PHP - Free OS
nathieb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 13h31   #2
Membre confirmé
 
Homme Grégoire MARTIN
Ingénieur développement logiciels
Inscription : janvier 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Homme Grégoire MARTIN
Âge : 32
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Finance

Informations forums :
Inscription : janvier 2011
Messages : 128
Points : 225
Points : 225
Bonjour,

Si j'ai bien compris :

A partir de la date du jour , tu veux savoir si tu dois retrancher ou non 1 an en fonction du resultat de l'opération num du mois dernier - 8 :
si cette opération ramène un chiffre négatif alors on retranche , sinon on ne retranche pas ?


Dans ce cas là un CASE me semble approprié :

Code :
1
2
3
4
5
6
7
SELECT CASE WHEN sign(TO_NUMBER(TO_CHAR(sysdate -INTERVAL '1' MONTH ,'MM')-8 )) = -1 
                 THEN TO_DATE('3112'||TO_CHAR((sysdate - INTERVAL '1' YEAR),'YYYY'),'DDMMYYYY')
            WHEN sign(TO_NUMBER(TO_CHAR(sysdate -INTERVAL '1' MONTH ,'MM')-8 )) = 0  
                 THEN TO_DATE('3112'||TO_CHAR((sysdate - INTERVAL '1' YEAR),'YYYY'),'DDMMYYYY')
            ELSE TO_DATE('3112'||TO_CHAR((sysdate),'YYYY'),'DDMMYYYY')
       END
FROM DUAL
__________________
Cordialement.
ORA-007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 13h50   #3
Membre chevronné
 
Avatar de nathieb
 
Homme olivier Thiébaut
Chef de projet/Architecte
Inscription : mai 2004
Messages : 626
Détails du profil
Informations personnelles :
Nom : Homme olivier Thiébaut
Âge : 45
Localisation : France

Informations professionnelles :
Activité : Chef de projet/Architecte
Secteur : Service public

Informations forums :
Inscription : mai 2004
Messages : 626
Points : 704
Points : 704
Par défaut Je pense

Bonjour,

effectivement l'idée est là, mais je n'arrivais pas à le traduire en When CASE.
J'avais pris le DECODE en espérant le traduire en TYPE INTERVAL mais cela ne semble pas fonctionner ?

Je pense récrire la solution avec votre(ta) requête pour la création de la vue.

Olivier
__________________
Architecte déstructurant,
be cool, be free

J2EE - PHP - Free OS
nathieb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 13h56   #4
Membre chevronné
 
Avatar de nathieb
 
Homme olivier Thiébaut
Chef de projet/Architecte
Inscription : mai 2004
Messages : 626
Détails du profil
Informations personnelles :
Nom : Homme olivier Thiébaut
Âge : 45
Localisation : France

Informations professionnelles :
Activité : Chef de projet/Architecte
Secteur : Service public

Informations forums :
Inscription : mai 2004
Messages : 626
Points : 704
Points : 704
Par défaut Résolu

Bonjour,

Effectivement cela me simplifie grandement la requête, j'avoue que je ne suis pas un aficionados des When case / decode

J'avais du mal à respecter les types avec le decode.

Grand Merci

Je vais maintenant voir si cela est conforme, aux attentes utilisateurs. En tout, cas la vue est créé

Olivier
__________________
Architecte déstructurant,
be cool, be free

J2EE - PHP - Free OS
nathieb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 13h57   #5
Membre confirmé
 
Homme Grégoire MARTIN
Ingénieur développement logiciels
Inscription : janvier 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Homme Grégoire MARTIN
Âge : 32
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Finance

Informations forums :
Inscription : janvier 2011
Messages : 128
Points : 225
Points : 225
Bonjour,

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE OR REPLACE FORCE VIEW AS 
SELECT 
..
FROM 
...
WHERE (DATE_OUVERTURE IS NULL 
           OR DATE_OUVERTURE <=  
(SELECT CASE WHEN sign(TO_NUMBER(TO_CHAR(sysdate -INTERVAL '1' MONTH ,'MM')-8 )) = -1 
                 THEN TO_DATE('3112'||TO_CHAR((sysdate - INTERVAL '1' YEAR),'YYYY'),'DDMMYYYY')
            WHEN sign(TO_NUMBER(TO_CHAR(sysdate -INTERVAL '1' MONTH ,'MM')-8 )) = 0  
                 THEN TO_DATE('3112'||TO_CHAR((sysdate - INTERVAL '1' YEAR),'YYYY'),'DDMMYYYY')
            ELSE TO_DATE('3112'||TO_CHAR((sysdate),'YYYY'),'DDMMYYYY')
       END
FROM DUAL
)
(
__________________
Cordialement.
ORA-007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 13h59   #6
Membre chevronné
 
Avatar de nathieb
 
Homme olivier Thiébaut
Chef de projet/Architecte
Inscription : mai 2004
Messages : 626
Détails du profil
Informations personnelles :
Nom : Homme olivier Thiébaut
Âge : 45
Localisation : France

Informations professionnelles :
Activité : Chef de projet/Architecte
Secteur : Service public

Informations forums :
Inscription : mai 2004
Messages : 626
Points : 704
Points : 704
Par défaut Efficacité

Bonjour,

Comme d'hab simple et efficace, l'équipe Oracle.

Cordialement
olivier
__________________
Architecte déstructurant,
be cool, be free

J2EE - PHP - Free OS
nathieb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 14h01   #7
Membre confirmé
 
Homme Grégoire MARTIN
Ingénieur développement logiciels
Inscription : janvier 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Homme Grégoire MARTIN
Âge : 32
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Finance

Informations forums :
Inscription : janvier 2011
Messages : 128
Points : 225
Points : 225
Apres si cette règle de gestion doit être appliquée à plusieurs endroits, il vaut peut être mieux l'encapsuler dans une fonction, ce qui sera plus facile à maintenir.
__________________
Cordialement.
ORA-007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 14h10   #8
Membre chevronné
 
Avatar de nathieb
 
Homme olivier Thiébaut
Chef de projet/Architecte
Inscription : mai 2004
Messages : 626
Détails du profil
Informations personnelles :
Nom : Homme olivier Thiébaut
Âge : 45
Localisation : France

Informations professionnelles :
Activité : Chef de projet/Architecte
Secteur : Service public

Informations forums :
Inscription : mai 2004
Messages : 626
Points : 704
Points : 704
Par défaut Package

Bonjour,

oui effectivement, j'ai pensé à créer une procédure ou fonction, mais pour l'instant c'est du colmatage urgence.

Olivier
__________________
Architecte déstructurant,
be cool, be free

J2EE - PHP - Free OS
nathieb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 15h48   #9
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 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Je trouve que l'implémentation de l'algorithme est trop complexe, et sa mise en pratique pas vraiment optimale non plus.

Vous comparez le mois moins un au mois d'août.
Pourquoi ne pas comparer le mois actuel au mois de septembre ?

Ensuite, il existe des fonctions dates qui permettent d'éviter toutes ces conversions !

Au final, ces deux expressions sont équivalentes, mais la seconde est beaucoup moins lourde en terme de conversion (et en bonus, en terme de syntaxe aussi) :
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
35
WITH sr AS
(
SELECT add_months(trunc(sysdate, 'yyyy'), level-1) AS dt
  FROM dual
connect BY level <= 12
)
SELECT dt
     , case
         when sign(to_number(to_char(dt -interval '1' month ,'mm')-8 )) = -1 
         then to_date('3112'||to_char((dt - interval '1' year),'yyyy'),'ddmmyyyy')
         when sign(to_number(to_char(dt -interval '1' month ,'mm')-8 )) = 0  
         then to_date('3112'||to_char((dt - interval '1' year),'yyyy'),'ddmmyyyy')
       else to_date('3112'||to_char((dt),'YYYY'),'ddmmyyyy')
       end AS exp1
     , case
         when extract(month FROM dt) BETWEEN 2 AND 9
         then trunc(dt, 'yyyy')-1
         else add_months(trunc(dt, 'yyyy')-1, 12)
       end AS exp2
  FROM sr;
 
DT         EXP1       EXP2      
---------- ---------- ----------
01/01/2011 31/12/2011 31/12/2011
01/02/2011 31/12/2010 31/12/2010
01/03/2011 31/12/2010 31/12/2010
01/04/2011 31/12/2010 31/12/2010
01/05/2011 31/12/2010 31/12/2010
01/06/2011 31/12/2010 31/12/2010
01/07/2011 31/12/2010 31/12/2010
01/08/2011 31/12/2010 31/12/2010
01/09/2011 31/12/2010 31/12/2010
01/10/2011 31/12/2011 31/12/2011
01/11/2011 31/12/2011 31/12/2011
01/12/2011 31/12/2011 31/12/2011
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 16h03   #10
Membre chevronné
 
Avatar de nathieb
 
Homme olivier Thiébaut
Chef de projet/Architecte
Inscription : mai 2004
Messages : 626
Détails du profil
Informations personnelles :
Nom : Homme olivier Thiébaut
Âge : 45
Localisation : France

Informations professionnelles :
Activité : Chef de projet/Architecte
Secteur : Service public

Informations forums :
Inscription : mai 2004
Messages : 626
Points : 704
Points : 704
Par défaut Merci

Bonjour,
Code :
1
2
3
4
SELECT add_months(trunc(sysdate, 'yyyy'), level-1) AS dt
  FROM dual
connect BY level <= 12
C'est quoi en français ?

Je me réponds, ce sont de requêtes hiérarchiques, bon bah vaincu ;-)

Top, et merci à tout deux, grande leçon.

Olivier
__________________
Architecte déstructurant,
be cool, be free

J2EE - PHP - Free OS
nathieb 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 20h27.


 
 
 
 
Partenaires

Hébergement Web