2017-11-20 4 views
0
%let rows = ""; 

%macro test; 

proc sql noprint; 
    select count(ID) 
    into: sqlRows 
    from mytbl; 
quit; 

%do i = 1 %to &sqlRows; * loop from 1 to sqlRows; 

    proc sql noprint; 
    select ID 
    into: ColumnID 
    from mytbl(firstobs= &i); 
    quit; 

    %if &rows eq "" %then %do 
    %let rows = "<tr><td>&ColumnID</td></tr>"; 
    %end; 

    %if &rows ne "" %then %do 
    %let rows = "&rows<tr><td>&ColumnID</td></tr>"; 
    %end; 

%end;*End loop; 

%mend; 

%test; 

%put &rows; 

Hallo Ich möchte alle Daten der Spalte ID Daten von Mytbl in eine Variable setzen.Überschreiben/Anhängen sas Variable

Ich habe eine Variable namens rows erstellt und ihr einen leeren Wert zugewiesen. Dann benutze ich die Schleife, ich bekomme die Werte nacheinander von mytab und speichere sie in columnID Variable. Wenn die Zeilenvariable leer ist, fügen Sie nur tr und td mit columnID-Daten hinzu. Wenn die Zeilenvariable nicht leer ist, fügen Sie sie an. aber es gibt mir nur die letzte Aufzeichnung meines Tisches.

können sagen mytbl Daten 1,2 hat und 3 in Spalte ID

Zeilen Variable sollte

<tr><td>1</td></tr><tr><td>2</td></tr><tr><td>3</td></tr> 

Daten haben, aber es ist nur mir Daten von letzten Reihe als

<tr><td>3</td></tr> 
+0

Ich sehe nicht, wo Sie irgendwelche Variablen erstellen. Sie scheinen nur versucht zu haben, Daten in Makrovariablen zu setzen. Es ist wahrscheinlich einfacher, die Daten in tatsächlichen Datensätzen zu behalten. Was planen Sie mit den Daten? Sieht aus wie HTML-Code, planen Sie eine HTML-Datei zu schreiben? – Tom

Antwort

3

Ich denke, dass Sie streng falsch verstehen, welche Makrovariablen im Gegensatz zu normalen Variablen in SAS sind. Sie sagen nicht genau, was Sie damit machen werden, aber nichtsdestoweniger.

Als erstes nehmen Makrovariablen keine Anführungszeichen an; Wenn sie sie enthalten, werden sie nur als normale Zeichen behandelt. Also:

%let var = ""; 
%let var = "&var.123"; 
%put &=var.; 

kehrt

"""123" 

da sie nicht wirklich viel über die Anführungszeichen wissen (es ist etwas bewusst von ihnen, aber es macht sie nicht die Art und Weise eine Behandlung normale SAS-Variable).

Zweitens, wie Quentin richtig ausführt, warum in aller Welt verwenden Sie SQL, um eine Zeile hintereinander zu gehen? Das ist im Grunde der gegenteilige Grund, für den Sie SQL verwenden würden. SQL ist großartig, um etwas für den gesamten Datensatz gleichzeitig zu tun, es ist absolut schrecklich in einer Zeile zu einer Zeit - dafür ist der Datenschritt gedacht.

data want; 
    set mytbl end=eof; 
    retain rows; *do not need to initialize to missing, that is normal; 
    length rows $32767; 
    rows = cats(rows,"<tr><td>",ColID,"</td></tr>"); 
    if eof then output; 
run; 

Sie würden in der Regel tun, wenn Sie zu gehen wurden:

Wenn Sie tatsächlich eine SAS Variable wollen, oder Sie wollen die Dinge eine Zeile zu einem Zeitpunkt verarbeiten, sollten Sie die Daten Schritt verwenden Sie einfach Verwenden Sie call execute, zum Beispiel, wenn Sie dies auf eine HTML-Seite (in einem gespeicherten Proc zum Beispiel) mit etwas Wrapper-Code, den Sie ausführen wollten, in if _n_=1 für den Start und if eof für das Ende geplant.

4
zeigt

Sie haben ein paar verschiedene Probleme, angefangen mit fehlenden Semikolons. Noch wichtiger ist, dass Ihr Code komplexer ist, als er sein muss. Mit SELECT SQL INTO können Sie mit einem PROC SQL-Schritt erreichen, was Sie wollen: Sie benötigen keinen separaten PROC SQL-Schritt für jeden Datensatz. Herumspielen mit:

data have; 
    do ID=1 to 3; 
    output; 
    end; 
run; 

proc sql noprint; 
    select cats('<tr><td>',ID,'</td></tr>') 
    into :Rows 
    separated by "" 
    from have; 
quit; 

%put &rows; 
Verwandte Themen