Pivot-Tabellen mit PROC SQL

Hallo zusammen,

gerade wollte ich eine Kreuztabelle erstellen und da der vorangegangene Programmcode komplett in SQL geschrieben ist und ich mir auch keine großen Gedanken darüber gemacht hab, hab ich einfach mal den folgenden Programm-Code eingetippt:

PROC SQL;
create table work.pivot as
transform count(F003) AS Anzahl
select F000
from work.basis
group by F000
pivot F004;
QUIT;

Leider hat das so nicht funktioniert :-( ... Kann mir vielleicht irgendjemand einen Tipp geben, wie ich das Problem mit PROC SQL lösen kann ? Auf die Idee es mit PROC TABULATE zu machen, bin ich schon selbst gekommen, aber es interessiert mich, wie's mit SQL gehen würde.

Grüße
Micha

Weitere Infos bitte

Wenn ich es richtig verstehe, versuchen Sie, SQL-Syntax von Microsoft SQL Server oder Microsoft Access in SAS zu verwenden. SAS kennt nicht die TRANSFORM- und PIVOT-KLauseln. Das macht man normalerweise in SAS nicht mit SQL, sondern mit PROC TRANSPOSE. Können Sie uns noch mehr Informationen liefern, wie die Eingabe und die Ausgabe Ihres Programms aussehen sollen? Wäre eine Lösung mit PROC TRANSPOSE akzeptabel?

...

Ergänzung:

macht denn der PROC TRANSPOSE das gleiche wie der PROC TABULATE ? Generell würde mich interessieren, ob eine Möglichkeit gibt eine Kreuztabellenabfrage mit PROC SQL zu schreiben und wie die Syntax dafür aussieht.

Unterschied TRANSPOSE - TABULATE

PROC TABULATE ertellt Kreuztabellenberichte, normalerweise HTML-, PDF- oder RTF-Dateien.
PROC TRANSPOSE erstellt hingegen eine transponierte SAS-Datei, ist also eher vergleichbar zu PROC SQL.
Es ist mir keine Möglichkeit bekannt, mit PROC SQL Kreuztabellen zu erstellen. Wenn es geht, soll es jemand hier posten.

...

Ja, ich dachte, ich kann die SQL-Syntax des Microsoft SQL Servers adaptieren.

Ausgangsbasis hierfür ist eine Tabelle in der im Feld F000 Filialen gelistet sind.Im Feld F003 steht die Außendienstmitarbeiter-Nr und im Feld F004 der Name des Mitarbeiters. Für jeden Außendiensteinsatz existiert ein Datensatz. Jetzt möchte ich wissen, in welcher Filiale welcher Außendienstmitarbeiter wie oft war ... ich hoffe, dass ist noch verständlich

Beispiel TRANSPOSE

/* Beispieldaten */
data basis;
input f000 f003 f004 $;
label
f000 = "Filiale"
f003 = "Nr. Mitarbeiter"
f004 = "Name Mitarbeiter"
;
datalines;
10000 101 Meier
10000 101 Meier
20000 101 Meier
30000 101 Meier
10000 102 Müller
20000 102 Müller
40000 102 Müller
40000 102 Müller
;

/* Mit proc tabulate als Liste */
proc tabulate data=basis;
class f000 f003 f004;
tables
f000,
f003="Mitarbeiter"*f004=" "*n=" "*f=8.
/ Box="Anzahl Einsätze";
quit;

/* Anzahl bestimmen */
proc sql;
create table count as
select f000, f003, f004, count(*) as Anzahl
from basis
group by f000, f003, f004;
quit;

/* transponieren (1) */
proc transpose data=count out=pivot1(drop=_name_);
by f000; /* Zeile: Filiale */
id f003; /* Spalte: Mitarbeiter */
idlabel f004; /* Label der Spalte: Mitarbeitername */
var Anzahl; /* Inhalt der Zellen */
run;

/* transponieren (2) */
proc sort data=count;
by f003 f004;
run;

proc transpose data=count out=pivot2(drop=_name_);
by f003 f004; /* Zeile: Mitarbeiter */
id f000; /* Spalte: Filiale ('_' wird vorangestellt) */
idlabel f000; /* Label der Spalte: Filiale */
var Anzahl; /* Inhalt der Zellen */
run;

Siehe "The Transpose Procedure" bzw. "The Tabulate Procedure" in der Online-Dokumentation.