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

Requêtes PostgreSQL Discussion :

Equivalence syntaxe entre ORACLE et POSTGRESQL


Sujet :

Requêtes PostgreSQL

  1. #1
    Nouveau membre du Club
    Equivalence syntaxe entre ORACLE et POSTGRESQL
    Bonjour à tous,

    Est ce que quelqu'un peut m'aider, je n'arrive pas à trouver la bonne syntaxe pour traduire une requête qui fonctionne sous Oracle et que je ne parviens pas à faire fonctionner sur une base POSTGRE
    Voici la requête sous Oracle :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT DISTINCT TO_CHAR(prl.CREATIONDATE,'YYYY') as "Année",
    	   COUNT(prl.ID) as "Nb LDA",
    	  COALESCE(SUM((GROSSUNITPR * VALIDATEDQTY) - ((GROSSUNITPR * VALIDATEDQTY) * DISCOUNT/100)),0) as "Montant LDA"
    	FROM CSPU_PRLINE prl
    WHERE TO_CHAR(prl.CREATIONDATE,'YYYY') = TO_CHAR(SYSDATE,'YYYY') -4 
    GROUP BY TO_CHAR(prl.CREATIONDATE,'YYYY')


    Sous POSTGRE j'ai commencé à rédiger cette requête ci-dessous qui fonctionne, mais je ne trouve pas l'équivalence sur ma clause WHERE
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT DISTINCT TO_CHAR(prl.CREATIONDATE,'YYYY') as "Année",
    	   COUNT(prl.ID) as "Nb LDA",
    	  COALESCE(SUM((GROSSUNITPR * VALIDATEDQTY) - ((GROSSUNITPR * VALIDATEDQTY) * DISCOUNT/100)),0) as "Montant LDA"
    	FROM CSPU_PRLINE prl
    WHERE TO_CHAR(prl.CREATIONDATE,'YYYY') = TO_CHAR(CURRENT_DATE,'YYYY') -4 ==> (Clause WHERE sur laquelle je bloque)
    GROUP BY TO_CHAR(prl.CREATIONDATE,'YYYY')


    Merci par avance
    Dominique

  2. #2
    Rédacteur/Modérateur

    Bonjour,

    Ce qui est très surprenant, c'est que sous Oracle, TO_CHAR(date) - 4 donne quelque chose...
    Parce qu'enlever la valeur 4 à une chaine de caractères, c'est étonnant...
    Il y a du transtypage automatique sous ça, mais ça n'est pas très rigoureux.

    Utilisez plutôt la fonction extract.
    Et profitez-en pour enlever le DISTINCT qui ne sert à rien avec le GROUP BY.
    Et pour avoir un pourcentage, si vos données sont de type entier, vous allez avoir un entier (division entière) en sortie, donc remplacez le 100 par 100.0 (pour forcer la division décimale).

    Au final, ça devrait donner quelque chose comme ça :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT EXTRACT(year FROM prl.CREATIONDATE) as "Année",
           COUNT(prl.ID) as "Nb LDA",
           COALESCE(SUM((GROSSUNITPR * VALIDATEDQTY) - ((GROSSUNITPR * VALIDATEDQTY) * DISCOUNT/100.0)),0) as "Montant LDA"
    FROM CSPU_PRLINE prl
    WHERE EXTRACT(year FROM prl.CREATIONDATE) = EXTRACT(year FROM CURRENT_DATE) - 4
    GROUP BY EXTRACT(year FROM prl.CREATIONDATE)


    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Membre confirmé
    Bonjour,

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    TO_CHAR(sysdate, 'YYYY') - 4


    Une conversion implicite du to_char en to_number aura lieu en effet, mais de toute façon ce n'est pas comme ça qu'il faut écrire la condition sous Oracle car un index ne sera pas utilisé potentiellement. Il faut plutôt écrire:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    WHERE prl.CREATIONDATE between trunc(sysdate, 'y') - interval '4' year AND trunc(sysdate, 'y') - interval '3' year -1

  4. #4
    Nouveau membre du Club
    Problème résolu
    Merci à Ced plus particulièrement,

    J'ai mon équivalence et également merci pour ta remarque sur Oracle, même si la requête construite à l'époque fonctionne malgré tout.
    Au départ je m'étais inspiré d'une requête que j'avais testé : SELECT TO_CHAR(SYSDATE,'YYYY') - 4 FROM DUAL et cela me retourne bien l'année 2016.

    Enfin merci encore à tous de m'avoir éclairé pour la requête.
    Cordialement
    Dominique (LePtit)

###raw>template_hook.ano_emploi###