Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/11/2010, 11h15   #1
Nouveau Membre du Club
 
Emmanuel Gautier
Inscription : juin 2010
Messages : 60
Détails du profil
Informations personnelles :
Nom : Emmanuel Gautier
Localisation : France, Yvelines (Île de France)

Informations forums :
Inscription : juin 2010
Messages : 60
Points : 28
Points : 28
Par défaut CASE dans requête SQL

Bonjour,

Je suis entrain de créer une requete ou les dates et l'année en cours on leur importance.

J'ai une expression calculé mais j'aimerais qu'elle prenne une valeur ou un autre celon l'année voulue.
J'ai tenté ceci mais cela ne fonctionne pas :

Code :
1
2
3
4
Round(([NB_RDV]*Month(Now()))/12,2) AS prorata,
CASE When [Formulaires]![F_Bilan_obj_superviseur]![XAnnée2]<= year(now() THEN [NB_RDV]
ELSE Prorata
END AS
Je veux donc que si l'année selectionné par l'utilisateur n'est pas l'année en cours nous avons prorata = NB_RDV et dans le cas ou l'année en cours est choisi nous retrouvons l'expression premiere de prorata.

Merci,
Manu
egautier18 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 11h46   #2
Expert Confirmé
 
Avatar de pc75
 
Inscription : septembre 2004
Messages : 2 802
Détails du profil
Informations personnelles :
Âge : 56
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : septembre 2004
Messages : 2 802
Points : 2 997
Points : 2 997
Bonjour,

Regarde avec IIF()
__________________
Par principe, je ne réponds pas aux messages URGENT.
Il n'y a pas de choses urgentes, il n'y a que des choses en retard. (un inconnu)
pc75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 11h46   #3
Nouveau Membre du Club
 
Emmanuel Gautier
Inscription : juin 2010
Messages : 60
Détails du profil
Informations personnelles :
Nom : Emmanuel Gautier
Localisation : France, Yvelines (Île de France)

Informations forums :
Inscription : juin 2010
Messages : 60
Points : 28
Points : 28
Je vois qu'il y a aussi la possibilité de faire ceci avec un IIF mais je ne comprend pas non plus la syntaxe attendu, si quelqu'un peut m'aider, que ce soit avec un CASE ou IIF je lui en serai reconnaissant.
Merci,
Manu
egautier18 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 11h58   #4
Membre actif
 
Benoit Rocco
Inscription : décembre 2009
Messages : 87
Détails du profil
Informations personnelles :
Nom : Benoit Rocco
Âge : 32
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : décembre 2009
Messages : 87
Points : 199
Points : 199
Case fonctionne uniquement en SQL, sous MS Access c'est du VBA et il faut donc utiliser IIF. Attention toutefois car une telle requête ne fonctionnera que sous Access et pas en ODBC.

Syntaxe du IIF (c'est dans MSDN...) :

Iif, fonction


Renvoie l'un ou l'autre de deux arguments selon l'évaluation d'uneexpression.

Syntaxe

IIf(expr, truepart, falsepart)

La syntaxe de la fonction IIf comporte lesarguments nommés suivants :

Élément Description
expr Expression à évaluer.
truepart Valeur ou expression renvoyée si la valeur de expr est True.
falsepart Valeur ou expression renvoyée si la valeur de expr est False.


Remarques

La fonction IIf évalue toujours truepart et falsepart, même si elle ne renvoie qu'un seul de ces arguments. Vous devez donc être particulièrement attentif à certains effets secondaires indésirables de cette fonction. Par exemple, si l'évaluation de falsepart engendre une division par zéro, une erreur se produit même si la valeur de expr est True.
captainKirk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 12h14   #5
Nouveau Membre du Club
 
Emmanuel Gautier
Inscription : juin 2010
Messages : 60
Détails du profil
Informations personnelles :
Nom : Emmanuel Gautier
Localisation : France, Yvelines (Île de France)

Informations forums :
Inscription : juin 2010
Messages : 60
Points : 28
Points : 28
Ok,

J'ai essayé ceci (en voyant que l'on pouvait imbriquer des IIF) mais cela ne fonctionne pas

Code :
IIf([Année]<='year(now())', NB_RDV,IIf([Année]='year(now())',Round(([NB_RDV]*Month(Now()))/12,2))) AS prorata2
cela te parait etre corect et possible ?
egautier18 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 13h21   #6
Nouveau Membre du Club
 
Emmanuel Gautier
Inscription : juin 2010
Messages : 60
Détails du profil
Informations personnelles :
Nom : Emmanuel Gautier
Localisation : France, Yvelines (Île de France)

Informations forums :
Inscription : juin 2010
Messages : 60
Points : 28
Points : 28
Je vous met ma requete complete et je rexplique ce que j'aimerais faire.

Code :
1
2
3
4
5
6
SELECT T_Rdv.Société, T_Clients.Segment AS T_Clients_Segment, T_Clients.Login_Commercial AS T_Clients_Login_Commercial, T_Objectifs.NB_RDV, Count(T_Rdv.Société) AS totalRdvEffectué, Sum(Round([Temps_passé]/100,2)) AS [Jours passés], Round([totalRdvEffectué]/[Prorata],2) AS Réalisation, T_Objectifs.Année, Round(([NB_RDV]*Month(Now()))/12,2) as prorata
FROM ((T_Users INNER JOIN T_Clients ON T_Users.Login_Commercial = T_Clients.Login_Commercial) INNER JOIN T_Objectifs ON T_Users.Login_Commercial = T_Objectifs.Login_Commercial) INNER JOIN T_Rdv ON (T_Clients.Index_Clients = T_Rdv.Index_Client) AND (T_Objectifs.Client = T_Rdv.Société) AND (T_Clients.Nom_Société = T_Rdv.Société)
WHERE (((T_Rdv.Date_RDV)<=Now()) AND ((Year(Now()))=[Formulaires]![F_Bilan_obj_superviseur]![XAnnée2]))
GROUP BY T_Rdv.Société, T_Clients.Segment, T_Clients.Login_Commercial, T_Objectifs.NB_RDV, T_Objectifs.Année, Round(([NB_RDV]*Month(Now()))/12,2), T_Users.Segment, T_Users.Segment2, T_Users.Segment3
HAVING (((T_Clients.Segment)=[Formulaires]![F_Bilan_obj_superviseur]![XSegment]) AND ((T_Objectifs.Année)=[Formulaires]![F_Bilan_obj_superviseur]![XAnnée2]))
ORDER BY T_Rdv.Société;
Le problème avec cette requête et que si l'on desire voir le bilan (résultat de la requête) pour les années passées ce n'est pas possible.
Le champ prorata ne doit pas non plus faire le même calcul.

Il me faut donc que prorata soit égal à
NB_RDV dans le cas d'une année passée, et à
Round(([NB_RDV]*Month(Now()))/12,2) dans le cas de l'année en cour.

Mon Where sera lui aussi à modifier je supose.
Merci,
Manu
egautier18 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 13h28   #7
Nouveau Membre du Club
 
Emmanuel Gautier
Inscription : juin 2010
Messages : 60
Détails du profil
Informations personnelles :
Nom : Emmanuel Gautier
Localisation : France, Yvelines (Île de France)

Informations forums :
Inscription : juin 2010
Messages : 60
Points : 28
Points : 28
je veux donc, pour compléter mon précédent message avoir quelque chose comme ceci
Code :
1
2
3
4
5
6
 
IF [Formulaires]![F_Bilan_obj_superviseur]![XAnnée2] < year(now())
            Prorata = NB_RDV
Else if [Formulaires]![F_Bilan_obj_superviseur]![XAnnée2] = year(now())
           Prorta = Round(([NB_RDV]*Month(Now()))/12,2))
End IF
egautier18 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 13h54   #8
Membre actif
 
Benoit Rocco
Inscription : décembre 2009
Messages : 87
Détails du profil
Informations personnelles :
Nom : Benoit Rocco
Âge : 32
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : décembre 2009
Messages : 87
Points : 199
Points : 199
Citation:
Envoyé par egautier18 Voir le message
Ok,

J'ai essayé ceci (en voyant que l'on pouvait imbriquer des IIF) mais cela ne fonctionne pas

Code :
IIf([Année]<='year(now())', NB_RDV,IIf([Année]='year(now())',Round(([NB_RDV]*Month(Now()))/12,2))) AS prorata2
cela te parait etre corect et possible ?
pourquoi mets-tu year(now()) entre cotes ?
captainKirk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 13h57   #9
Nouveau Membre du Club
 
Emmanuel Gautier
Inscription : juin 2010
Messages : 60
Détails du profil
Informations personnelles :
Nom : Emmanuel Gautier
Localisation : France, Yvelines (Île de France)

Informations forums :
Inscription : juin 2010
Messages : 60
Points : 28
Points : 28
Je dois t'avouer que je n'en ai pas la moindre idée.
Si je l'enleve la syntaxe est corect ?
egautier18 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 14h00   #10
Membre actif
 
Benoit Rocco
Inscription : décembre 2009
Messages : 87
Détails du profil
Informations personnelles :
Nom : Benoit Rocco
Âge : 32
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : décembre 2009
Messages : 87
Points : 199
Points : 199
Oui, si tu mets du code entre cotes, il ne sera pas interprété, ca sera considéré comme une simple chaine de caractères !
captainKirk est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/11/2010, 14h09   #11
Nouveau Membre du Club
 
Emmanuel Gautier
Inscription : juin 2010
Messages : 60
Détails du profil
Informations personnelles :
Nom : Emmanuel Gautier
Localisation : France, Yvelines (Île de France)

Informations forums :
Inscription : juin 2010
Messages : 60
Points : 28
Points : 28
Je les ai en effet enlevé et cela fonctionne.

Je me permet d'abuser de ton aide. Puis-je mettre un IFF dans le where aussi ?
Car maintenant j'aimerais que les conditions de mon where :

Code :
WHERE (((T_Rdv.Date_RDV)<=Now()) AND ((Year(Now()))=[Formulaires]![F_Bilan_obj_superviseur]![XAnnée2]))
puisse se modifier celon l'année comme précédement

Je m'occuperais de la syntaxe après maintant que ma aidé mais avant je veux savoir si je peux faire quelque chose qui en résumé serait

Code :
1
2
3
4
5
6
Where
IF Année=year(now())
            (((T_Rdv.Date_RDV)<=Now()) AND ((Year(Now()))=[Formulaires]![F_Bilan_obj_superviseur]![XAnnée2]))
Else IF Année < year(now())
                 year([date_Rdv])=[Formulaires]![F_Bilan_obj_superviseur]![XAnnée2]))
END IF
egautier18 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 14h21   #12
Nouveau Membre du Club
 
Emmanuel Gautier
Inscription : juin 2010
Messages : 60
Détails du profil
Informations personnelles :
Nom : Emmanuel Gautier
Localisation : France, Yvelines (Île de France)

Informations forums :
Inscription : juin 2010
Messages : 60
Points : 28
Points : 28
J'ai enfait mis un OR tout bete.

Merci beaucoup de m'avoir aidé cela me sert enormement pour mon projet.
Bonne journée
Encore merci,
Manu
egautier18 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h47.


 
 
 
 
Partenaires

Hébergement Web