PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 27/05/2016 19:06:29

Douk V5
Banni(e)

Comment rendre une condition WHERE dynamique?

slt à tous,

j'ai un soucis actuellement.

la requête ci-dessous, je l'utilise dans pour Rapport conçu sur Pentaho Reporting Designer donc l'année est mon paramètre.

En SQL j'ai ceci:

SELECT T.annee as annee, T.ca as ca
FROM

     SELECT  extract(year from ma_date) as annee, SUM (PrixVte) as ca
     From ma_table
     WHERE ma_date BETWEEN (SELECT  date_trunc('year',current_date)) and (SELECT current_date)
     GROUP BY annee
    UNION
    SELECT  extract(year from ma_date) as annee, SUM (PrixVte) as ca
    From ma_table
    WHERE ma_date BETWEEN (SELECT date_trunc('year',current_date -interval '1 year')) and (SELECT current_date -interval '1 year')
    GROUP BY annee
   
)T
GROUP BY annee
ORDER BY annee desc


Ceci fonctionne uniquement quand je sélectionne 2016 et les autres non! Et je comprend pourquoi: Les WHEREs ne sont pas dynamique!!!


Mais mon problème c'est que je veux rendre les différent WHERE de mon SQL dynamique. De telle manière qu'en sélectionnant l'année 2016 par exemple j'ai ceci:


Résultat:
----------------------------------
Annee                 ca

2016                   200000             ------------> entre '2016-05-01' au '2016-05-27'

2015                   145000              ------------> entre '2015-05-01' au '2015-05-27'


ou bien 2015


Résultat:
----------------------------------
Annee                 ca

2015                  450000                     ---------->  entre '2015-05-01' au '2014-05-27'
2014                  355000                     ---------->  entre '2014-05-01' au '2014-05-27'


Du coût j'ai pensé à écrire une fonction qui prend l'année choisie comme paramètre d'entré et me retourne le premier jour du mois en cours et la date du jour pour l'année en entré. Ainsi que la correspondance pour l'année précédente.


Donc: Entre le  2016-05-01 au 2016-05-27  pour le premier WHERE et entre le  2015-05-01 au 2015-05-27  pour le deuxième WHERE par exemple si 2016 est le paramètre.


Et faire appel à la fonction dans mes différents WHERE.


svp quelqu'un peut-il m'aider pr la fonction?? ou bien y'a t-il une autre alternative pour mon probleme??


Merci de me venir en aide!  smile  smile

Hors ligne

#2 27/05/2016 23:44:45

gleu
Administrateur

Re : Comment rendre une condition WHERE dynamique?

Quel est votre problème lors de l'écriture de cette fonction ?


Guillaume.

Hors ligne

#3 28/05/2016 09:54:22

Douk V5
Banni(e)

Re : Comment rendre une condition WHERE dynamique?

En fait j'ai juste pensé que je pouvais solutionner mon problème en passant par l'écriture d'une fonction, mais je ne sait pas comment m'y prendre. c'est ce pourquoi je demande de l'aide.

Les fonctions je ne m'y connaît pas dutout.


Merci.

Hors ligne

#4 29/05/2016 22:46:05

gleu
Administrateur

Re : Comment rendre une condition WHERE dynamique?


Guillaume.

Hors ligne

#5 02/06/2016 18:15:35

Douk V5
Banni(e)

Re : Comment rendre une condition WHERE dynamique?

Merci pour le lien.


j'ai pu faire la fonction qui me renvoie le premier jour du mois et l'autre le premier jour de l'année avec une date comme paramètre.


CREATE  FUNCTION FirstDayOfMonth (date) RETURNS date as
$$
    SELECT (EXTRACT(YEAR FROM $1::date)||'-'||EXTRACT(MONTH FROM $1::date)||'-01')::date;
$$
LANGUAGE 'sql';

CREATE FUNCTION FirstDayOfYear(date) RETURNS date as
$$
    SELECT (EXTRACT(YEAR FROM $1::date)||'-'||'01'||'-01')::date;
$$
LANGUAGE 'sql';




Je veux obtenir le même résultat, cette fois si plutôt  avec une année comme paramètre.


Quelqu'un pour m'aider svp ????

Hors ligne

#6 02/06/2016 21:45:13

gleu
Administrateur

Re : Comment rendre une condition WHERE dynamique?

Quel problème rencontrez-vous pour son écriture ?


Guillaume.

Hors ligne

#7 07/06/2016 11:10:36

Douk V5
Banni(e)

Re : Comment rendre une condition WHERE dynamique?

Slt,


Juste une réflexion et j'ai pu écrit ces petites fonctions qui solutionnent mon problème.

CREATE OR REPLACE FUNCTION FirstDayOfCurrentYear (year integer) RETURNS date as
$$
    SELECT ($1::integer||'-'||'01'||'-01')::date;
$$
LANGUAGE'sql';

CREATE OR REPLACE FUNCTION FirstDayOfPrecedentYear (year integer) RETURNS date as
$$
    SELECT ($1::integer - 1||'-'||'01'||'-01')::date;
$$
LANGUAGE'sql';

CREATE OR REPLACE FUNCTION CurrentDate_Of_CurrentYear (year integer) RETURNS date as
$$
   
    SELECT ($1::integer||'-'||EXTRACT(MONTH FROM current_date)||'-'||EXTRACT(DAY FROM current_date))::date;
$$
LANGUAGE'sql';

Etc.

Merci pour le temps mis à vouloir m'aider.

lol lol

Hors ligne

Pied de page des forums