Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[WD8] Code SQL conditionnel

10 réponses
Avatar
Real Phil
Bonjour,

Avec le langage de développement précédent, son SQL permettait de remplir
des colonnes selon certaines conditions dont voici un exemple simple.

SELECT Fournisseur,
SUM(IIF(YEAR(DteAchat)=YEAR(AN_Act,QteAchat,0)) AS Qte_AnAct,
SUM(IIF(YEAR(DteAchat)=YEAR(AN_Prec,QteAchat,0)) AS Qte_AnPrec
FROM Produit
GROUP by Fournisseur

Avec ce code, chaque colonne Qte_AnAct et Qte_AnPrec se remplissent selon la
date d'achat de chaque produit.

Est-ce qu'une astuce existe en SQL de Windev pour arriver à faire la même
chose ?

Réal Phil

10 réponses

Avatar
tj
je te dirais sur oracle tu as le decode et le case
mais HF debutant dans le SQL, je pense pas que ce genre de chose existe.


"Real Phil" a écrit dans le message de groupe
de discussion : R2cYi.3150$
Bonjour,

Avec le langage de développement précédent, son SQL permettait de remplir
des colonnes selon certaines conditions dont voici un exemple simple.

SELECT Fournisseur,
SUM(IIF(YEAR(DteAchat)=YEAR(AN_Act,QteAchat,0)) AS Qte_AnAct,
SUM(IIF(YEAR(DteAchat)=YEAR(AN_Prec,QteAchat,0)) AS Qte_AnPrec
FROM Produit
GROUP by Fournisseur

Avec ce code, chaque colonne Qte_AnAct et Qte_AnPrec se remplissent selon
la
date d'achat de chaque produit.

Est-ce qu'une astuce existe en SQL de Windev pour arriver à faire la même
chose ?

Réal Phil



Avatar
Roumegou Eric
tj a formulé ce mercredi :
je te dirais sur oracle tu as le decode et le case
mais HF debutant dans le SQL, je pense pas que ce genre de chose existe.



j'avais cru comprendre qu'en HF on pouvait meme créer ses propres
fonctions en wlangage et les utiliser dans la requete ????

Meme si je trouve que le principe n'est pas à recommander car
s'éloigner du standard sql n'est pas une bonne chose à mon avis.



"Real Phil" a écrit dans le message de groupe de
discussion : R2cYi.3150$
Bonjour,

Avec le langage de développement précédent, son SQL permettait de remplir
des colonnes selon certaines conditions dont voici un exemple simple.

SELECT Fournisseur,
SUM(IIF(YEAR(DteAchat)=YEAR(AN_Act,QteAchat,0)) AS Qte_AnAct,
SUM(IIF(YEAR(DteAchat)=YEAR(AN_Prec,QteAchat,0)) AS Qte_AnPrec
FROM Produit
GROUP by Fournisseur

Avec ce code, chaque colonne Qte_AnAct et Qte_AnPrec se remplissent selon
la
date d'achat de chaque produit.

Est-ce qu'une astuce existe en SQL de Windev pour arriver à faire la même
chose ?

Réal Phil






--
Eric Roumégou
Webmaster des wtablettes
http://cerbermail.com/?qE7t4Qvilo
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
mat
Salut Réal,

je pense que tu devras attendre la sortie de WD12 pour cela. En plus, je
pense qu'il manque une parenthèse sinon le IIF ne fonctionne pas
correctement : SUM(IIF(YEAR(DteAchat)=YEAR(AN_Act),QteAchat,0))

Voilà un exemple comment je ferais la chose sur HF qui n'est certes pas
aussi élégant mais devrait être assez efficace. Peut-être un expert SQL
92 sait faire en une seule requête.... :-)

1) Requête de sélection, donnera 2 lignes par compte (ou produit),
résultat dans une source de donnée:
select idaccount, sum(amount) as CurrYear, 0 as PrevYears
from journal
where date >= '20070101' // resp. comparer à YEAR(AN_Act)
group by idaccount
union
select idaccount, 0 as CurrYear, sum(amount) as prevYears
from journal
where date < '20070101' // resp. comparer à YEAR(AN_Prec)
group by idaccount
order by idaccount


2) Totalisation
select idaccount, sum(CurYear) as CurrYear, sum(PrevYears) as PrevYears
FROM maSourceDonnees
group by idaccount
order by idaccount


Salutations
Mat
Avatar
mat
Roumegou Eric wrote:
...
j'avais cru comprendre qu'en HF on pouvait meme créer ses propres
fonctions en wlangage et les utiliser dans la requete ????


...

Bonsoir Eric,

si tu sais comment, je suis preneur. Dans mon WD10, je ne peux même pas
imbriquer des fonctions ce qui limite énormément l'usage de requêtes
pour certaines tâches. Peut-être un raison de bouger vers WD12 :-)

Salutations
Mat
Avatar
Real Phil
Salut Mat,

SUM(IIF(YEAR(DteAchat)=YEAR(AN_Act),QteAchat,0))



Tu as tout à fait raison pour cette parenthèse. Très bonne observation.
..résultat de code tapé aux p'tites heures du matin après une dure journée..
;-)

Ta suggestion de requête en deux temps est excellente et fonctionne à
merveille.
Cela fera très bien l'affaire en attendant la WD12.

Merci beaucoup, c'est très apprécié.

Réal Phil


"mat" a écrit dans le message de
news:

Salut Réal,

je pense que tu devras attendre la sortie de WD12 pour cela. En plus, je
pense qu'il manque une parenthèse sinon le IIF ne fonctionne pas
correctement : SUM(IIF(YEAR(DteAchat)=YEAR(AN_Act),QteAchat,0))

Voilà un exemple comment je ferais la chose sur HF qui n'est certes pas
aussi élégant mais devrait être assez efficace. Peut-être un expert SQL
92 sait faire en une seule requête.... :-)

1) Requête de sélection, donnera 2 lignes par compte (ou produit),
résultat dans une source de donnée:
select idaccount, sum(amount) as CurrYear, 0 as PrevYears
from journal
where date >= '20070101' // resp. comparer à YEAR(AN_Act)
group by idaccount
union
select idaccount, 0 as CurrYear, sum(amount) as prevYears
from journal
where date < '20070101' // resp. comparer à YEAR(AN_Prec)
group by idaccount
order by idaccount


2) Totalisation
select idaccount, sum(CurYear) as CurrYear, sum(PrevYears) as PrevYears
FROM maSourceDonnees
group by idaccount
order by idaccount


Salutations
Mat


Avatar
b.engelmajer
On peut ruser en utilisant la valeur renvoyer par la recherche de
l'année en début de date. QteAchat est pultiplié par 0 ou 1 selon la
présence ou de l'année de l'année.

Un exemple testé chez moi:
SELECT
Prix.Date AS Date
Prix.Tarif AS Tarif
PATINDEX('2006%', Prix.Date) * Prix.Tarif AS Prix_2006,
PATINDEX('2007%', Prix.Date) * Prix.Tarif AS Prix_2007
FROM
Prix

Une adaptation possible pour la requête :
SELECT
Fournisseur,
PATINDEX(AN_Act +'%',DteAchat) * QteAchat AS Qte_AnAct,
PATINDEX(AN_Prec+'%',DteAchat) * QteAchat AS Qte_AnPrec,
FROM
Produit
GROUP BY
Fournisseur
Avatar
mat
wrote:
...
Une adaptation possible pour la requête :
SELECT
Fournisseur,
PATINDEX(AN_Act +'%',DteAchat) * QteAchat AS Qte_AnAct,
PATINDEX(AN_Prec+'%',DteAchat) * QteAchat AS Qte_AnPrec,
FROM
Produit
GROUP BY
Fournisseur


...

c'est une superbe solution et je m'en servirai aussi. Merci.

Mat
Avatar
Real Phil
a écrit...

Une adaptation possible pour la requête :
SELECT
Fournisseur,
PATINDEX(AN_Act +'%',DteAchat) * QteAchat AS Qte_AnAct,
PATINDEX(AN_Prec+'%',DteAchat) * QteAchat AS Qte_AnPrec,
FROM
Produit
GROUP BY
Fournisseur

Superbe astuce !
En modifiant légèrement le code j'obtiens mes résultats avec un minimum de
code.

Vraiment Formidable !

Réal Phil
Avatar
b.engelmajer
J'utilise cette astuce depuis longtemps sous mySql de façon plus
simple avec un simple test sur l'égalité de 2 valeurs.

Ex:
COUNT(population.sexe='F') as NbeFemme
COUNT(population.sexe='H') as nbeHomme

Le COUNT sur un test logique permet de fabriquer facilement des
tableaux de données!
Classe d'âge, intervalle de chiffres d'affaires,...
Avatar
mat
wrote:
J'utilise cette astuce depuis longtemps sous mySql de façon plus
simple avec un simple test sur l'égalité de 2 valeurs.

Ex:
COUNT(population.sexe='F') as NbeFemme
COUNT(population.sexe='H') as nbeHomme

Le COUNT sur un test logique permet de fabriquer facilement des
tableaux de données!
Classe d'âge, intervalle de chiffres d'affaires,...





malheureusement count(rectype ) ne passe pas en WD10.

Concernant intervalle de chiffre d'affaires, j'ai un état de table
croisé que je n'ai réussi à utiliser qu'avec des périodes d'une année,
2007, 2006, 2005, etc. Mais comment je fais si la période de base va du
01/10/2006 au 30/09/2007 et que je veux les chiffres des périodes
précédentes, an-1, an-2, an-3, etc?
Merci d'avance pour une idée...