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

Requêtes PostgreSQL Discussion :

Equivalence syntaxe entre ORACLE et POSTGRESQL [11]


Sujet :

Requêtes PostgreSQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Consultant GMAO
    Inscrit en
    Novembre 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant GMAO
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 17
    Points : 30
    Points
    30
    Par défaut 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
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 008
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 008
    Points : 23 684
    Points
    23 684
    Par défaut
    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 chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 135
    Points : 1 913
    Points
    1 913
    Par défaut
    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
    Homme Profil pro
    Consultant GMAO
    Inscrit en
    Novembre 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant GMAO
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 17
    Points : 30
    Points
    30
    Par défaut 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)

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

Discussions similaires

  1. [MySql] Equivalent NVL de Oracle
    Par nantais dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 26/09/2007, 16h28
  2. Equivalence entre Oracle et Sql Server
    Par sfaxi dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 17/01/2007, 10h27
  3. [Debat] Oracle vs PostgreSQL
    Par Spoutnik dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 09/11/2004, 01h26
  4. interface entre oracle et MySQL
    Par sbenoist dans le forum Oracle
    Réponses: 21
    Dernier message: 19/08/2004, 19h51
  5. syntax sql spéciale pour postgresql ???
    Par krimson dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 05/05/2004, 16h23

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