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 :

Filtre glissant en SQL avec la fonction decode


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 123
    Points : 83
    Points
    83
    Par défaut Filtre glissant en SQL avec la fonction decode
    Bonjour à tous,

    je ne suis pas spécialiste du SQL mais dois néanmoins m'en servir dans le Designer de Business Objects.

    J'essaie de programmer un filtre dynamique pour mes requêtes, qui doit répondre à la question : si le mois en cours est janvier, alors récupère les données de l'année précédente, sinon celles de l'année en cours.

    je passe par la fonction decode mais doute de pouvoir l'utiliser à cette fin dans un filtre. J'ai comme erreur "ExceptionBD, ORA-00907 : missing right parenthisis State: N/A". Mais il me semble qu'il ne manque pas de parenthese fermante.

    voici mon code. pourriez vous m'aider ? Merci.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    SELECT UBK_LQUA_HISTO.LQUA_DATEJ
     
    WHERE
     
    decode(TO_NUMBER(To_CHAR(sysdate,'MM')),'01',(TO_NUMBER(To_CHAR(UBK_LQUA_HISTO.LQUA_DATEJ,'YYYY'))=TO_NUMBER(TO_CHAR(sysdate,'YYYY'))-1),(TO_NUMBER(To_CHAR(UBK_LQUA_HISTO.LQUA_DATEJ,'YYYY'))=TO_NUMBER(TO_CHAR(sysdate,'YYYY'))))
    jeremy
    Jérémy

  2. #2
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Il n'y a pas de à spécifier "=" dans decode... la syntaxe est :
    decode(valeur à tester, si valeur possible 1, alors valeur de retour 1, si valeur de possible 2, alors valeur de retour2, ..., valeur par défaut).

    Donc dans ton where, il faut que tu testes l'année en fonction d'un decode ou un case qui ne traite que le SYSDATE.

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  3. #3
    Membre confirmé
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Points : 562
    Points
    562
    Par défaut
    Vous pouvez faire plus simple en vous insprant de ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT U.LQUA_DATEJ from UBK_LQUA_HISTO U
    Where  -- si le mois en cours est janvier, alors récupère les données de l'année précédente
           (to_char(sysdate,'MM') = '01' and to_char(U.LQUA_DATEJ,'YYYY') = to_char(sysdate-40,'YYYY')) 
    or
           -- sinon c'est l'annee en cours
           (to_char(sysdate,'MM') != '01' and to_char(U.LQUA_DATEJ,'YYYY') = to_char(sysdate,'YYYY'))
    Signé : Capitaine Jean-Luc Picard

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 123
    Points : 83
    Points
    83
    Par défaut
    Grand merci à tous les 2.

    pacmann : pour l'explication sur les egalités dans le decode

    argoet : ta solution fonctionne à merveille et me fait progresser énormément d'un seul coup.

    a bientot.
    Jérémy

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Essayez plutôt ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UBK_LQUA_HISTO.LQUA_DATEJ >= case extract(month from sysdate) when 1 then add_months(trunc(sysdate, 'YYYY'), -12) else trunc(sysdate, 'YYYY') end
    Il ne faut pas appliquer de fonction aux colonnes de vos tables quand on peut jouer sur les constantes, vous perdez du temps de calcul et l'utilisation des index et partitions s'ils existent.

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

Discussions similaires

  1. requette sql avec la fonction days between
    Par wiski08000 dans le forum Débuter
    Réponses: 4
    Dernier message: 08/01/2014, 19h03
  2. Creer une requete SQL avec la fonction PIVOT
    Par SALIA LOUA OLIVIER dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/10/2013, 15h35
  3. Récupérer des valeurs SQL avec la fonction fetch()
    Par Invité dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 29/07/2010, 14h22
  4. [AJAX] requete SQL avec une fonction javascript
    Par Mitsu78 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/03/2008, 21h37
  5. requete SQl avec la fonction max () qui ne marche pas
    Par eclipse012 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/11/2006, 14h32

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