Minimum und Maximum einer Spalte
Hallo zusammen,
ich dachte mit SQL eine Möglichkeit gefunden zu haben den kleinsten und größten Wert einer Spalte auszulesen. Diese sollen für eine einheitliche Gestaltung von Diagrammen dienen. Es kommt jedoch immer zu einer Fehlermeldung, dass der Symbolischer Verweis XMIN nicht aufgelöst werden konnte. Was mache ich falsch?
Danke im Voraus viele Grüsse
Alex
INPUT sub group dv1 dv2 dv3 dv4;
CARDS;
1 1 3 4 7 3
2 1 6 8 12 9
3 1 7 13 11 11
4 1 0 3 6 6
5 2 5 6 11 7
6 2 10 12 18 15
7 2 10 15 15 14
8 2 5 7 11 9
;
RUN;
%MACRO minmax(daten, xaxis, yaxis);
PROC SQL NOPRINT;
SELECT
min(&xaxis.)
, max(&xaxis.)
, min(&yaxis.)
, max(&yaxis.)
INTO
:xmin
, :xmax
, :ymin
, :ymax
FROM &daten.;
%let xmin = %sysfunc(Round(&xmin,10));
%let xmax = %sysfunc(Round(10+&xmax,10));
%let ymin = %sysfunc(Round(&ymin,10));
%let ymax = %sysfunc(Round(10+&ymax,10));
QUIT;
%MEND minmax;
%minmax(daten=wide, xaxis=dv1, yaxis=dv2);
axis1 order=(&xmin TO &xmax );
axis2 order=(&ymin TO &ymax );
DATA aaa;
DATA aaa;
SET aaa;
x=&xmax;
y=&ymax;
RUN;
(Die Datei aaa habe ich nur erstellt um zu sehen welche Werte übergeben werden.)
1351 INPUT sub group dv1 dv2 dv3 dv4;
1352 CARDS;
HINWEIS: Die Datei WORK.WIDE weist 8 Beobachtungen und 6 Variablen auf.
HINWEIS: DATA-Anweisung benötigt. (Gesamtverarbeitungszeit):
Echtzeit 0.01 Sekunden
CPU-Zeit 0.01 Sekunden
1361 ;
1362 RUN;
1363
1364 %MACRO minmax(daten, xaxis, yaxis);
1365 PROC SQL NOPRINT;
1366 SELECT
1367 min(&xaxis.)
1368 , max(&xaxis.)
1369 , min(&yaxis.)
1370 , max(&yaxis.)
1371 INTO
1372 :xmin
1373 , :xmax
1374 , :ymin
1375 , :ymax
1376 FROM &daten.;
1377
1378
1379 %let xmin = %sysfunc(Round(&xmin,10));
1380 %let xmax = %sysfunc(Round(10+&xmax,10));
1381 %let ymin = %sysfunc(Round(&ymin,10));
1382 %let ymax = %sysfunc(Round(10+&ymax,10));
1383
1384 QUIT;
1385 %MEND minmax;
1386
1387 %minmax(daten=wide, xaxis=dv1, yaxis=dv2);
MLOGIC(MINMAX): Ausführung beginnt.
MLOGIC(MINMAX): Parameter DATEN hat Wert wide
MLOGIC(MINMAX): Parameter XAXIS hat Wert dv1
MLOGIC(MINMAX): Parameter YAXIS hat Wert dv2
MPRINT(MINMAX): PROC SQL NOPRINT;
SYMBOLGEN: Makrovariable XAXIS wird in dv1 aufgelöst
SYMBOLGEN: Makrovariable XAXIS wird in dv1 aufgelöst
SYMBOLGEN: Makrovariable YAXIS wird in dv2 aufgelöst
SYMBOLGEN: Makrovariable YAXIS wird in dv2 aufgelöst
SYMBOLGEN: Makrovariable DATEN wird in wide aufgelöst
MPRINT(MINMAX): SELECT min(dv1) , max(dv1) , min(dv2) , max(dv2) INTO :xmin , :xmax , :ymin ,
:ymax FROM wide;
MLOGIC(MINMAX): %LET (Variablenname ist XMIN)
SYMBOLGEN: Makrovariable XMIN wird in 0 aufgelöst
MLOGIC(MINMAX): %LET (Variablenname ist XMAX)
SYMBOLGEN: Makrovariable XMAX wird in 10 aufgelöst
MLOGIC(MINMAX): %LET (Variablenname ist YMIN)
SYMBOLGEN: Makrovariable YMIN wird in 3 aufgelöst
MLOGIC(MINMAX): %LET (Variablenname ist YMAX)
SYMBOLGEN: Makrovariable YMAX wird in 15 aufgelöst
MPRINT(MINMAX): QUIT;
HINWEIS: PROZEDUR SQL benötigt. (Gesamtverarbeitungszeit):
Echtzeit 0.00 Sekunden
CPU-Zeit 0.00 Sekunden
MLOGIC(MINMAX): Ausführung wird beendet.
1388 axis1 order=(&xmin TO &xmax );
-
22
76
WARNUNG: Symbolischer Verweis XMIN nicht aufgelöst.
WARNUNG: Symbolischer Verweis XMAX nicht aufgelöst.
1389 axis2 order=(&ymin TO &ymax );
-
22
76
WARNUNG: Symbolischer Verweis YMIN nicht aufgelöst.
WARNUNG: Symbolischer Verweis YMAX nicht aufgelöst.
FEHLER 22-322: Syntaxfehler, erwartet wird eines der folgenden:
eine Zeichenkette in Hochkommata, eine numerische Konstante,
eine Datetime-Konstante.
FEHLER 76-322: Syntaxfehler, Anweisung wird ignoriert.
1390
1391 DATA aaa;
HINWEIS: Die Datei WORK.AAA weist 1 Beobachtungen und 0 Variablen auf.
HINWEIS: DATA-Anweisung benötigt. (Gesamtverarbeitungszeit):
Echtzeit 0.01 Sekunden
CPU-Zeit 0.00 Sekunden
1392 DATA aaa;
1393 SET aaa;
1394 x=&xmax;
-
22
WARNUNG: Symbolischer Verweis XMAX nicht aufgelöst.
1395 y=&ymax;
-
22
WARNUNG: Symbolischer Verweis YMAX nicht aufgelöst.
FEHLER 22-322: Syntaxfehler, erwartet wird eines der folgenden: ein Name,
eine Zeichenkette in Hochkommata, eine numerische Konstante,
eine Datetime-Konstante, ein fehlender Wert, INPUT, PUT.
1396 RUN;
HINWEIS: Das SAS System hat die Verarbeitung dieses Schritts aufgrund von Fehlern abgebrochen.
WARNUNG: Die Datei WORK.AAA ist möglicherweise unvollständig. Beim Beenden des Schrittes waren
0 Beobachtungen und 4 Variablen vorhanden.
WARNUNG: Datei WORK.AAA wurde nicht ersetzt, da dieser Schritt angehalten wurde.
HINWEIS: DATA-Anweisung benötigt. (Gesamtverarbeitungszeit):
Echtzeit 0.01 Sekunden
CPU-Zeit 0.01 Sekunden
- Anmelden oder Registrieren um Kommentare zu schreiben

Hallo, es fehlt einfach nur
Hallo,
es fehlt einfach nur ein %global xmin ...; danach sind die Macrovariablen auch ausserhalb des Macros bekannt.
Gruß MK
Lokale Variablen
Hallo zurück,
Makrovariable, die innerhalb eines Makros angelegt werden, sind per default-Einstellung nur lokale Variable. D.h. mit Beendigung des Makros gibt es diese Variablen nicht mehr.
Mit Hilfe des Statements "%global Makrovariable" kann man aber die entsprechende Variable als global definieren:
%global xmin xmax ymin ymax ;
PROC SQL NOPRINT;
SELECT
min(&xaxis.)
, max(&xaxis.)
, min(&yaxis.)
, max(&yaxis.)
INTO
:xmin
, :xmax
, :ymin
, :ymax
FROM &daten.;
%let xmin = %sysfunc(Round(&xmin,10));
%let xmax = %sysfunc(Round(10+&xmax,10));
%let ymin = %sysfunc(Round(&ymin,10));
%let ymax = %sysfunc(Round(10+&ymax,10));
QUIT;
%MEND minmax;
Viel Erfolg
Lutz Ritter
Danke
Vielen Dank,
so funktioniert es.
Gruß
Alex