[WD8] Code SQL conditionnel

Le
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
tj
Le #14577301
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" 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



Roumegou Eric
Le #14577291
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" 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é)
mat
Le #14577261
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
mat
Le #14577251
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
Real Phil
Le #14577241
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" 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


b.engelmajer
Le #14577191
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
mat
Le #14577171
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
Real Phil
Le #14577161

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
b.engelmajer
Le #14577141
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,...
mat
Le #14577131
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...
Publicité
Poster une réponse
Anonyme