Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 27/05/2016 19:06:29
- Douk V5
- Membre
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!
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
- Membre
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?
Tout est expliqué sur http://docs.postgresql.fr/9.5/plpgsql.html
Guillaume.
Hors ligne
#5 02/06/2016 18:15:35
- Douk V5
- Membre
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
- Membre
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.
Hors ligne
Pages : 1