[SQL/SAS] Requête qui ne fonctionne pas

Requête qui ne fonctionne pas [SQL/SAS] - SQL/NoSQL - Programmation

Marsh Posté le 03-02-2016 à 13:35:18    

Bonjour,  
 
Voici mon problème, que je vais essayer de vous exposer le plus clairement possible :
 
J'ai une table qui contient des infos du format suivant :

|    q    | val_n1 | val_n2 | ... | val_n33 |
| 0.00001 |        |        |     |         |
|   ...   |        |        |     |         |
|    1    |        |        |     |         |


 
J'ai en entrée :
- a : la valeur que je dois chercher
- b : la colonne "val_nx" dans laquelle je dois chercher
 
Je veux trouver dans la colonne b la valeur la plus proche de a, et récupérer la valeur de q correspondant à cette ligne.
 
Après moult essais, voici ce à quoi j'arrive pour le moment, et qui ne fonctionne pas  [:tinostar]  
 

%macro test(a,b);
proc sql;
select q
from etape01.table_q
where abs(&b-&a)=(select min(abs(&b-&a)) from etape01.table_q)
quit;
%mend test;


 
Ce code me renvoie l'erreur suivante :
 

Syntax error, expecting one of the following: !, !!, &, *, **, +, -, /, <, <=, <>, =, >, >=, AND, EQ, EQT, GE, GET, GROUP, GT, GTT, HAVING, LE, LET, LT, LTT, NE, NET, OR, ORDER, ^=, |, ||, ~=.


 
Je suppose qu'il y a un truc évident qui m'échappe : l'un d'entre vous pourrait-il m'aider à faire fonctionner ma macro ?
 
Merci d'avance à ceux qui pourront m'aider :jap:


Message édité par $temp le 03-02-2016 à 13:37:03
Reply

Marsh Posté le 03-02-2016 à 13:35:18   

Reply

Marsh Posté le 03-02-2016 à 15:38:57    

Les & ne doivent pas convenir :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 03-02-2016 à 16:01:08    

J'ai pourtant l'impression que ça convient bien : c'est bien interprété, et par exemple si j'exécute la requête incluse seule, elle fonctionne.
 
Mes messages d'erreur me mettent le code interprété, et il est bon :
(Je l'appelle 3 fois avec des valeurs indiquées en dur pour voir si ça marche, et ces valeurs sont bien reprises)
 
Toutes mes excuses mais reho.st est mort, donc je passe par HostingPics (vignette cliquable) :
http://img11.hostingpics.net/thumbs/mini_42869020160203155716.png
 
J'ai l'impression qu'il y a (encore) une particularité liée à SAS que j'ignore...

Reply

Marsh Posté le 03-02-2016 à 16:05:41    

Je connais pas SAS, désolé.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 03-02-2016 à 16:07:25    

Moi non plus, et là est bien mon problème :o
 
Merci quand même, ça me confirme au moins qu'il n'y a pas une énormité dans ma requête que j'aurais ratée :jap:

Reply

Marsh Posté le 04-02-2016 à 09:26:40    

Si c'est du "vrai" SQL, quelque chose m'échappe : tu fais (B - A) où B est une colonne et A une valeur ?
 
Tu ne soustrairais pas des choux et des carottes ?

Reply

Marsh Posté le 04-02-2016 à 09:38:07    

Je pense qu'il veut dire que b désigne une valeur de la colonne val_nx.
Donc, il calcule pour chaque enregistrement dans la table table_q, (val_nx - a).
 
Edit : cela dit, ça serait pas plus simple de faire : select q, (b-a) as Diff from etape01.table_q ORDER BY Diff Limit 0, 1
Limit 0, 1 c'est pour avoir juste le premier enregistrement ayant le Diff le plus faible. Ca évite la sous-requête.


Message édité par rufo le 04-02-2016 à 09:40:12

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 04-02-2016 à 12:49:30    

Chelmi18 > En fait, &b est effectivement le nom de la colonne et &a une valeur, mais cette valeur &a est interprétée comme une matrice de dimension (1,n) qui contiendrait tout le temps la meme valeur. Ca fonctionne quand les requêtes ne sont pas imbriquées.
 
rufo > J'ai fait des tests avec LIMIT, je voulais faire des SORT BY puis récupérer mon minimum avec un LIMIT... sauf que LIMIT n'est pas reconnu par SAS (quel logiciel en mousse, au prix qu'il coute... :o) Il faut le préciser via un outobs= mais qui s'applique à toute la proc, ça ne m'arrange pas du coup.
 
Je crois que je vais devoir forcément créer deux proc SQL à la suite pour réussir à faire mon truc.


Message édité par $temp le 04-02-2016 à 12:50:44
Reply

Sujets relatifs:

Leave a Replay

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