Merge unter Formatanweisung

Hallo zusammen,

ich habe folgendes Problem in SAS. Ich benutze für einige Merkmale ein Format. Wenn ich Tabellen betrachte, wird dieses Format auch angezeigt. Lasse ich mir diese Tabelle nach Excel exportieren, so wird aber nicht mehr das Format-Label angezeigt, sondern einer der hinter dem Format liegenden Werte. Bei proc summarys konnte ich dieses Problem mit class statt by umgehen.
Nun muss ich jedoch 2 Dateien zusammenführen, die anhand der Formatlabel offenbar zusammenpassen. Dies funktioniert aber nicht auf Grund der o.g. Problematik.
Weiß jemand wie man dieses Problem löst? Gibt es evtl. einen anderen Weg als einen Datastep mit merge zu nutzen? Wichtig wäre mir, dass man an Hand des Formates zusammenführt.

Viele Grüße

Matthias

mit SQL

vielleicht so:
data a;
input a b;
cards;
1 100
2 200
4 300
;
run;

data b;
input a c;
cards;
3 300
5 600
;
run;
proc format;
value a
1-3=1
other=2
;
run;
proc sql;
create table ab as
select a.* ,b.*
from a left join b
on put(a.a,a.)=put(b.a,a.);
quit;

Join/Merge direkt über Format

Die hier beschriebene Lösung löst zwar ein Format auf, macht aber immer noch einen "echten" SQL-Join. Schöner und auch deutlich performanter ist es, einen Join/Merge direkt über ein Format zu machen.

eine gute Beschreibung wie das funktioniert finden Sie (neben anderen Alternativen zum joinen/mergen) hier:
http://www2.sas.com/proceedings/sugi22/CODERS/PAPER88.PDF

Viele Grüße
Tim_Taylor

Vielen Dank für die

Vielen Dank für die Antwort, das sieht schonmal gut aus.
Ich kann leider noch nicht 100%ig erkennen, was Dateien, Spalten, Formate sind, speziell beim .. on put (a.a,a.)=put(b.a,a.)
Ist diese Variante auch irgendwie anwendbar, wenn man mehrere Variablen hat, nach denen gematcht werden soll?
Ich verwende bislang eine Variable &classvar., worin die zu matchenden Merkmale gespeichert sind, z.B. classvar = Merk1 Merk2 Merk3, und eine Variable &format., z.B. Merk1 format1. Merk2 format2. Merk3 format3.
Kann man diese Struktur bei obigem Code verwenden?

Viele Grüße
Matthias

ja, Sie müßten dann in der

ja, Sie müßten dann in der on anweisung mit and verknüpfen
on put(a.merk1,format1)=put(b.merk1,format1) and
put(a.merk2,format2)=put(b.merk2,format2) and ...

Ok, habe ich mir fast so

Ok, habe ich mir fast so gedacht. Wie ist es dann am elegantesten möglich dies umzusetzen. Wie ich beschrieben habe, habe ich bislang nur eine Makrovariable classvar, in der alle Merkmale durch ein blank getrennt aufgeführt sind, Bsp.: classvar = Merk1 Merk2 Merk3 (Anzahl apriori unbekannt), und eine Makrovariable format, Bsp.: format = Merk1 format1. Merk2 format2.
Sollte man diese beiden Variablen "auseinanderpflücken" (wie am besten?) oder das komplette Programm ändern, so dass alles separat übergeben wird? (um die put(..,..)-Anweisung nutzen zu können)
Viele Grüße
Matthias

sie können ihre

sie können ihre Makrovariablen durch ein Makro auseinanderpflücken
und sich den benötigten Programmtext über ein Makro generieren lassen.

Danke für den Hinweis. Ich

Danke für den Hinweis. Ich habe mich entschieden, diese Variablen einzeln zu übergeben, da ich leider keine Ahnung habe, wie das "auseinanderpflücken" per Makro funktionieren könnte.

Viele Grüße

Matthias

letzte Frage ;-)

Hallo nochmal,

ich habe die oben genannte Anweisung in einem Makro implementiert:
proc sql;
create table spdswork.ms_test5 as
select * , *
from spdswork.ms_test4 left join spdswork.ms_test2
on %put(ms_test4.&Merk1 , &format1.)=%put(ms_test2.&Merk1 , &format1.)
and
%put(ms_test4.&Merk2 , &format2.)=%put(ms_test2.&Merk2 , &format2.)
and
%put(ms_test4.&Merk3 , &format3.)=%put(ms_test2.&Merk3 , &format3.)
and
%put(ms_test4.&Merk4 , &format4.)=%put(ms_test2.&Merk4 , &format4.);
quit;

Aber ich erhalte noch folgende Fehlermeldung im Log:
(spdswork.ms_test4.TYPKLNEU , tkl_kh.)=
ERROR: The following columns were not found in the contributing tables: quit.
NOTE: PROC SQL set option NOEXEC and will continue to check the syntax of statements.
NOTE: The SAS System stopped processing this step because of errors.
NOTE: PROCEDURE SQL used (Total process time):
real time 0.01 seconds
cpu time 0.00 seconds

Ich habe schon mehrere Sachen probiert, z.B. in der select-Anweisung statt *,* auch ms_test4.*, ms_test2.* oder auch in der put-Anweisung noch die Library vorangestellt. Aber es hilft bislang nichts.
Wäre für Ratschläge dankbar.

Viele Grüße

Matthias

es muss put statt %put

es muss put statt %put heissen!

Ich habe es mit put statt

Ich habe es mit put statt %put probiert und dann erscheint folgende Fehlermeldung:
NOTE: Line generated by the invoked macro "FEHLER".
2793 ms_test2.&Merk2 , &format2.) and put(ms_test4.&Merk3 , &format3.)=put(ms_test2.&Merk3
- -
22 200
2793! , &format3.) and put(ms_test4.&Merk4 , &format4.)=put(ms_test2.&Merk4 , &format4.);
2793! quit; proc sql; select sum(VDAUER_real), sum(
NOTE 137-205: Line generated by the invoked macro "FEHLER".
2793 ms_test2.&Merk2 , &format2.) and put(ms_test4.&Merk3 , &format3.)=put(ms_test2.&Merk3
2793! , &format3.) and put(ms_test4.&Merk4 , &format4.)=put(ms_test2.&Merk4 , &format4.);
-
22
2793! quit; proc sql; select sum(VDAUER_real), sum(
ERROR 22-322: Syntax error, expecting one of the following: a name, *.

ERROR 200-322: The symbol is not recognized and will be ignored.

Vom Gefühl würde ich fast sagen, dass es Probleme damit gibt, die Makrovariablen Merk1, Format1 usw. aufzulösen...

Viele Grüße
Matthias

gelöst

Hallo zusammen,
vielen Dank nochmal für die Unterstützung. Ich habe den Fehler bei meinem Makro gefunden. Es lag daran, dass Merk3, format3 usw. nicht belegt waren, d.h. das Makro war an anderer Stelle schon falsch.

Viele Grüße
Matthias