[Access/SQL] Problème de tranche (de pain de mie !!)

Problème de tranche (de pain de mie !!) [Access/SQL] - SQL/NoSQL - Programmation

Marsh Posté le 08-07-2003 à 12:25:35    

Salut,
 
J'aurais besoin de votre aide sur le point suivant (que je simplifie pour rendre compréhensible) :
 
Je dispose d'une table myTable avec un seul champ "value"!
 
Je voudrais pouvoir écrire une query (quitte à créer une autre table à coté) qui puisse me retourner le champ de myTable, ainsi qu'un deuxieme champ me disant dans quel intervalle se trouve la valeur de myTable!
 
Un example, je veux décider :
< 100           => tranche1
>= 100 et < 200 => tranche2
>= 200 et < 250 => tranche3
>= 250          => tranche4
 
Donc, si ma table contient les valeurs :
 
Value
-----
-15
18
132
300
 
Je voudrais que ma requete me retourne :
 
Value      Tranche
-----      -------
-15        tranche1
18         tranche1
132        tranche2
300        tranche4
 
Avez vous des idées?
 
Je voudrais bien sur le nombre de tranches puisse etre plus grand, mais la, c'est juste pour un exemple !
 
yoyo*
 

Reply

Marsh Posté le 08-07-2003 à 12:25:35   

Reply

Marsh Posté le 08-07-2003 à 12:45:21    

J'utilise ça regarde si ça peux te servir :
 

Code :
  1. While ((Repeat1__numRows <> 0) AND (NOT Divers.EOF))
  2. Dim Coef
  3. Coef =""
  4. if ((Divers.Fields.Item("Tarif" ).Value) > 1) and ((Divers.Fields.Item("Tarif" ).Value)<= 5) Then
  5. Coef = 3
  6. end if
  7. if ((Divers.Fields.Item("Tarif" ).Value)> 5) and ((Divers.Fields.Item("Tarif" ).Value)<= 15) Then
  8. Coef = 2
  9. end if
  10. if ((Divers.Fields.Item("Tarif" ).Value)> 15) and ((Divers.Fields.Item("Tarif" ).Value)<= 50) Then
  11. Coef = 1.8
  12. end if
  13. if ((Divers.Fields.Item("Tarif" ).Value)> 50) and ((Divers.Fields.Item("Tarif" ).Value)<= 290) Then
  14. Coef = 1.7
  15. end if
  16. if ((Divers.Fields.Item("Tarif" ).Value)> 290) and ((Divers.Fields.Item("Tarif" ).Value)<= 700) Then
  17. Coef = 1.6
  18. end if
  19. if ((Divers.Fields.Item("Tarif" ).Value)> 700) and ((Divers.Fields.Item("Tarif" ).Value)<= 1000) Then
  20. Coef = 1.5
  21. end if
  22. if ((Divers.Fields.Item("Tarif" ).Value)> 1000) and ((Divers.Fields.Item("Tarif" ).Value)<= 1520) Then
  23. Coef = 1.4
  24. end if
  25. if ((Divers.Fields.Item("Tarif" ).Value)> 1520) and ((Divers.Fields.Item("Tarif" ).Value)<= 15240) Then
  26. Coef = 1.3
  27. end if

Reply

Marsh Posté le 08-07-2003 à 14:09:32    

Bah, le probleme, c'est que tout se passe avec du code, alors que le but pour moi eest de récupérer les résultats sous forme de requete (quitte à créer une table intermédiaire contenant les infos de chaque trnache, genre avec 3 champs : ValMin, ValMax et NomDe tranche
 
Des autres idées?

Reply

Marsh Posté le 08-07-2003 à 14:52:14    

Kekchose comme ça .. avec des iif imbriqués
 
SELECT IIf(monchamp < "100", "tranch1", IIf(monchamp < "200","tranch2","tranch3" ))
FROM matable;

Reply

Marsh Posté le 08-07-2003 à 14:56:07    

vttman2 a écrit :

Kekchose comme ça .. avec des iif imbriqués
 
SELECT IIf(monchamp < "100", "tranch1", IIf(monchamp < "200","tranch2","tranch3" ))
FROM matable;


 
OPui, mais tu t'imagines la taille de la requetes si j'ai plusieurs tranches? D'autre part, c'est pas flexible, je ne peux pas rajouter et enlever des tranches !
 
je penche plus vers une soltuion à deux tables : myTable et tabTranches, mais ensuite, je ne sais aps comment faire...

Reply

Marsh Posté le 08-07-2003 à 15:24:22    

Yoyo@ a écrit :


 
OPui, mais tu t'imagines la taille de la requetes si j'ai plusieurs tranches? D'autre part, c'est pas flexible, je ne peux pas rajouter et enlever des tranches !
 
je penche plus vers une soltuion à deux tables : myTable et tabTranches, mais ensuite, je ne sais aps comment faire...


 
Oui j'imagine bien ... ça m'émeut pas !
Bon bien sur si t'as 50 tranches ...
 
Sinon tu peux créer un formulaire de paramètrage (ex: paramf)
avec des fourchettes et un libellé
ex :  
champ10 => 100  
champ11 => 200
libel1  => Tranche1
 
champ20 => 100  
champ21 => 200
libel2  => Tranche2
 
libeldefaut  => Hors tranche
 
Puis une requête paramétrée
 
SELECT  
IIf(monchamp >= forms!paramf.champ10 and  
    monchamp < forms!paramf.champ11, forms!paramf.libel1,  
IIf(monchamp >= forms!paramf.champ20 and  
    monchamp < forms!paramf.champ21, forms!paramf.libel2,  
,forms!paramf.libeldefaut))  
FROM matable;  
 
 
Sinon autre soluce , tu crées une 2ème colonne et
par programme (parcours recordset) tu renseignes  
cette colonne (tranche1, tranche2 ...) puis tu lances
ta requête sur les 2 colonnes la répartition étant alors
déjà effectuée ...  
 
 
Bon si ça te convient pas, j'ai d'autres idées tordues  ;)  
 

Reply

Marsh Posté le 08-07-2003 à 15:35:50    

Le probleme, c'est que ce que j'appelais myTable, c'est plutot déja un résultat de requete, et je voulais utiliser cette requete en source d'une nouvelle requete !
 
Donc, tu peux considérer que j'ai une requeete myRequest avec un champ myValue prenant des valeur entieres, et on va dire une table tranches, contenant trois champs : nomTranche, minTranche, maxTranche !
 
Et je veux exécuter une requete par dessus ca qui me donnera deux colonne : myValue et nomDeTranche !
 
J'imagine que ca doit se faire par lintermédiare d'une requete (donc plus rapide) que par du VBA avec lequel je devrais créer une table en dur à partir de myRequest, et pour chaque enregistrement, aller chercher le nom de la tranche et la copier dans la table nouvellement créée.

Reply

Marsh Posté le 08-07-2003 à 16:03:50    

Et ça tout simplement ?
 
 
table t1 =>
x
-------------
25
100
-15
10
233
 
table t2 =>
a b lib
--------------------
0 100 lib0
101 200 lib1
201 300 lib2
 
 
requête
 
SELECT t1.*, t2.*,iif(t2.a is null,"Hors fourchette","Ok fourchette" )
FROM t1 left JOIN t2  
ON t1.x >= t2.a and t1.x <=  t2.b;
 

Reply

Marsh Posté le 08-07-2003 à 16:06:44    

J'avais oublié de poster le résultat  :ouch:  
 
x a b lib Expr1002
--------------------------------------------------
25 0 100 lib0 Ok fourchette
100 0 100 lib0 Ok fourchette
-15    Hors fourchette
10 0 100 lib0 Ok fourchette
233 201 300 lib2 Ok fourchette

Reply

Marsh Posté le 08-07-2003 à 16:08:09    

vttman2 a écrit :

Et ça tout simplement ?
 
 
table t1 =>
x
-------------
25
100
-15
10
233
 
table t2 =>
a b lib
--------------------
0 100 lib0
101 200 lib1
201 300 lib2
 
 
requête
 
SELECT t1.*, t2.*,iif(t2.a is null,"Hors fourchette","Ok fourchette" )
FROM t1 left JOIN t2  
ON t1.x >= t2.a and t1.x <=  t2.b;
 
 

savais plus justement si on pouvait faire ca avec une requete (meme si le principe me parait bete!)
 
Donc, je vais essayer tout ça, merci ;)
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed