Dr. Andreas Christmann Universität Dortmund, HRZ, 04.06.1999 "! Inhalt 1. WAS IST SQL ? ....................................................................................................................2 2. WAS IST PROC SQL ? .........................................................................................................2 3. WAS KANN PROC SQL ?.....................................................................................................2 4. BEISPIELE ZUR VERWENDUNG VON PROC SQL ...........................................................4 4.1 Fiktiver Beispieldatensatz......................................................................................................................................4 4.2 Einfache Tabellen ..................................................................................................................................................6 4.3 Subsets mit WHERE..............................................................................................................................................8 4.4 Subsets mit HAVING.............................................................................................................................................9 4.5 JOIN : Zusammenfügung von Tabellen .............................................................................................................. 10 4.6 CREATE: Erzeugung neuer Tabellen.................................................................................................................. 20 4.7 INSERT und SET: Einfügung neuer Beobachtungen ......................................................................................... 21 4.8 UPDATE und SET: Änderung von Variablen oder einzelner Werte ................................................................. 22 4.9 ALTER und ADD: Einfügen neuer Variablen .................................................................................................... 24 4.10 4.10.1 4.10.2 4.10.3 5. PROC SQL Pass-Through Facility .................................................................................................................. 25 Daten stehen in einer SAS-Datei .................................................................................................................... 25 Verwendung von SAS/ACCESS .................................................................................................................... 26 Verwendung der PROC SQL Pass-Through Facility....................................................................................... 27 LITERATUR.......................................................................................................................28 Beachten Sie bitte, daß für die angegebenen Texte, Programme und Beispiele selbstverständlich keinerlei Garantie und Gewährleistung übernommen wird. Der verwendete Beispieldatensatz ist rein fiktiv. 1. Was ist SQL ? SQL steht für Structured Query Language. SQL ist eine standardisierte, weitverbreitete Sprache, um in Tabellen und Datenbanken Abfragen durchzuführen oder den Datenbestand zu aktualisieren. 2. Was ist PROC SQL ? PROC SQL ist die SQL-Implementation von SAS. PROC SQL ist Bestandteil des Moduls SAS/Base und kann für alle SAS-Datendateien verwendet werden. PROC SQL kann insbesondere für Datenbankabfragen und einfachere Reports eine Alternative zu der SAS Hochsprache im DATA-Step oder zu SAS-Prozeduren sein. Viele Elemente der SAS-Hochsprache wie - globale Befehle - DATA SET Optionen - Funktionen, und - INFORMAT- und FORMAT-Befehle können in PROC SQL wie in anderen SAS-Prozeduren verwendet werden. Jedoch sind mit PROC SQL kompliziertere statistische Verfahren nicht durchführbar. 3. Was kann PROC SQL ? PROC SQL kann verwendet werden für - Erzeugung von Reports - Berechnung statistischer Kennzahlen wie z.B. Anweisung COUNT, FREQ, N NMISS SUM MEAN, AVG MIN MAX RANGE VAR STD STDERR CV T PRT Kennzahl Anzahl (ohne fehlende Werte) Anzahl fehlender Werte Summe Mittelwert Minimum Maximum Range (Maximum – Minimum) Varianz Standardabweichung Standardfehler Variationskoeffizient (in Prozent) Teststatistik für Student’s t-Test für die Nullhypothese, daß der Erwartungswert gleich 0 ist p-Wert für zweiseitigen Student’s t-Test - Datenbankabfragen - Sortierung der Ausgaben - Zusammenfügen von Daten aus verschiedenen Tabellen - Erzeugen von Tabellen oder Ansichten (Views) - Modifizierung bzw. Update von Datenwerten in PROC SQL-Tabellen - Modifizierung von PROC SQL-Tabellen durch Hinzufügung, Änderung oder Löschung von Variablen (Spalten) - Modifizierung bzw. Update von DBMS-Tabellen (Data Base Management System) mittels SAS/ACCESS Views oder mit der PROC SQL Pass-Through facility Auf die Angabe der gesamten Syntax von PROC SQL wird hier verzichtet und auf die entsprechenden SAS-Manuals verwiesen. Online kann mittels HELP → PROC SQL unter dem Eintrag SYNTAX die Syntax dieser Prozedur nachgeschaut werden, deren wesentliche Anweisungen in der folgenden Tabelle aufgelistet sind. Durch Anklicken der einzelnen Befehle öffnen sich Untermenüs. PROC SQL <option-list>; ALTER TABLE alter-statement; CREATE create-statement; DELETE delete-statement; DESCRIBE describe-statement; Aufruf der Prozedur Hinzufügen oder Löschen von Variablen Erzeugung von Tabellen Löscht Zeilen von Tabellen, meist in Verbindung mit WHERE Druckt SQL CREATE TABLE Befehle zur Erzeugung der Tabelle. Sinnvoll beim Transfer in andere DBMS DROP drop-statement; Löscht Tabellen INSERT insert-statement; Erstellt neue Zeilen in neuen oder existierenden Tabellen RESET <option-list>; Einstellung von Optionen SELECT select-statement; Führt die eigentliche Abfrage durch, formatiert den Report, erstellt den Report im SAS-Output-Fenster UPDATE update-statement; Modifiziert die Datenwerte in einer Spalte in existierenden Zeilen einer Tabelle VALIDATE validate-statement; Prüft die syntaktische Korrektheit einer SQL-Abfrage, ohne diese Abfrage durchzuführen Ebenfalls mittels HELP PROC SQL ist eine Online-Hilfe verfügbar zu den folgenden Einträgen: Macro variables set by PROC SQL statements Components of the PROC SQL statements DICTIONARY tables CALCULATED keyword SQL Procedure Pass-Through Facility 4. Beispiele zur Verwendung von PROC SQL 4.1 Fiktiver Beispieldatensatz 1 ***************************************************************************; 2 * Beispiele zur Verwendung von PROC SQL in SAS Version 6.12 Windows *; 3 * Andreas Christmann, 01.06.1999 *; 4 * Fiktiver Datensatz, keine Gewaehr *; 5 ***************************************************************************; 6 OPTIONS NOCENTER LINESIZE=143 PAGESIZE=40 NODATE; RUN; 7 LIBNAME saskurs "d:\saskurs"; NOTE: Libref SASKURS was successfully assigned as follows: Engine: V612 Physical Name: d:\saskurs 7 RUN; 8 PROC FORMAT; 9 VALUE geschlf 10 1="weiblich" 11 2="männlich" 12 .="k.A."; NOTE: Format GESCHLF has been output. 13 VALUE schadf 14 0="nein" 15 1="ja" 16 .="k.A."; NOTE: Format SCHADF has been output. 17 RUN; NOTE: The PROCEDURE FORMAT used 0.28 seconds. 18 DATA saskurs.dat1; 19 INPUT id Name $12. Vorname $12. Geschl Gebdat Geld VSumme; 20 LABEL id="ID" Name="Name" Vorname="Vorname" Geschl="Geschlecht" 21 Gebdat="Geburtsdatum" Geld="Geld" VSumme="Vers.Summe"; 22 INFORMAT Gebdat ddmmyy10.; 23 FORMAT Geschl geschlf. Geld 9.0 Gebdat ddmmyy10.; 24 CARDS; NOTE: The data set SASKURS.DAT1 has 12 observations and 7 variables. NOTE: The DATA statement used 0.28 seconds. 37 ; 38 RUN; 39 TITLE1 "Verwendeter fiktiver Beispieldatensatz"; RUN; 40 PROC PRINT LABEL; ID id; RUN; NOTE: The PROCEDURE PRINT used 0.1 seconds. #%$%& '($ ) *+$ ,+$+& -+.+/ ,+. 0+$+&"1 $ . 2 3 . $ 4 *+5 ,+$ ) 2 5 ,+6 8 9;: 5 <+$ #%=%& ) 5 <+$ >+$+2 ?+@ 4 $ ? @ ,;> $+A B+& ,%2 * 5 ,+B < 7GF+? @ < . , 6 HE) *%& $ 5 '($ .+A 4 . ? @ I(7 J 7 7+J 7 K L%7 N;F+? @ < . , 6 O+& 5 ) /%P Q , ,+=R<+S ) ) 4 . ? @ 7 7 J 7 NEJ 7 K L N MU1 5+& = ) H(4 -%& $ * <+S ) ) 4 . ? @ 7 7 J I V(J 7 K W%7 TUX $ ,+6 = 4 * HE) *%& $ 5+2 <+S ) ) 4 . ? @ I(7 J I YEJ 7 K L T W[Z 5 ) \ HE)+] 5 '($ .+A 4 . ? @ I(7 J I YEJ 7 K L L L^HE) *(& $ = , ,+.C_ 5%& . 5 <+S ) ) 4 . ? @ I(7 J I YEJ 7 K W V VC>+5 B * . HE)+] 5 '($ .+A 4 . ? @ 7 7 J I TEJ 7 K L%7 YU1 5+& = ) _ 5%& . 5 '($ .+A 4 . ? @ 7 N(J I TEJ 7 K L N K;>+5 B * . O+& . ,+6 <+S ) ) 4 . ? @ 7 M(J I TEJ 7 K W M 7 IU_ = $ 4 4 $+& HE) *%& $ 5+2 <+S ) ) 4 . ? @ I(7 J I TEJ 7 K L W 7 7^_ = $ 4 4 $+& HE) *%& $ 5+2 <+S ) ) 4 . ? @ D 7 N;F ,%& B ) 6 `%@ = <+5 2 <+S ) ) 4 . ? @ 7 T(J I V(J 7 K L L > $ 4 *C#%$+& 2ED F%B < < $ MIII 7II TIII LII WIII 7VII 7WII 7II 7MII WI NLII MII WMII VII TIIIII TIII MIII TWI 7IIIIII MIIII 7II D VIIIII 7WIII 7 41 42 PROC CONTENTS DATA=saskurs.dat1; RUN; NOTE: The PROCEDURE CONTENTS used 0.1 seconds. a%b%c d(b e f+b g+b+c h+i+j g+i k+b+c"l b i m n i b o f+p g+b e m p g+q s t+u v+w u v xzy { t s+w | } { w | p g p"x+b gzu p ~ bx +x+ } { x | %v% t% m b%c k+p g+i e mE r b ~+ b+cv %n b| +v a%p%c i p o b+m w+e i+e b a+% r e f b b+mE s(c b p g b f zv+ b m f p % e b( t% m b%c k+p g+i e b e g+ p+m gz f i h i b f zv+ b m f p % e b( | b o b g b ft% m b+c k p g+i +e m y%c g+b g+i +eE s+ ~+n+c b+m m b f ut | p g p"x+b gv %n b x+%c g+b f ut p+ b o w+e i+e b( +m gz| b n b+e f+b e g e h++c ~ p g+i +e | p g p"x+b gzy p bx i q b ¡( r u+ ~+ b+c" hz| p g+p"x+b gzy p b+mE ¢ i o bz¢ %c ~+p g + ¢ i%c m gz| p g+py p b p t+ mn b+cy p b r+ t% m"i ez¢ i%c m gz| p g+py p b£ r (o n p b g+i ¤ i+m gz h"a%p+c i p o b+m"p+e f%g g(c i g+b m ¥ a%p%c i p o bCv +n bU b+eCy +m;¢ +c ~ p g e h %c ~+p g¦ p+ b o §¨; § § § § §©+§ w § l § | §+§v § § § § § § § u+§ §~ § § § § § § § §¡ª § § § § § § §U § § § § § | § | § § §« §«E§ §§ ¬ § § § § § | § | § § §« §«E§ §§ ¬ § § § § §© § b+§ § § c §g+§ m §f § p §g%§ §~ ;©+w+ | u+ ~ ¡ª ¡; ©bof ;©+w x s+ u+ ~ ¡ª r;©+w x s + ¢E © b+m o b g ; | u+ ~ ¡ | rUu ( w s% p%cª r ¡ u p ~+b Ca+t+{ u % wRs% p%cª rªr a+%c e p ~ b ^a+x+} w u+ ~ ¡ª¨ a+b%c mE x+ ~ ~+b r 4.2 Einfache Tabellen 43 ****************** Häufigkeitsverteilung für Geschlecht ************; 45 TITLE1 'Häufigkeitsverteilung für die Variable Geschlecht'; RUN; 46 TITLE2 'mit SELECT und GROUP BY' ;RUN; 47 TITLE3 'COUNT(*) gibt missing values als solche aus'; 48 TITLE4 'COUNT(geschl) gibt missing values als 0 aus'; 49 PROC SQL; 50 SELECT geschl, COUNT(*) FROM saskurs.dat1 51 GROUP BY geschl; 52 QUIT; NOTE: The PROCEDURE SQL used 0.17 seconds. ­ ®+¯ °+± ²+³ ´ ± µ+¶ · ´%¸ µ ´ ± ¹+¯ º ²"°%» ¸ ¼+± ´½+¾%¸ ± ¾+¿ ¹ ´"À+´ ¶ Á  ¹ ´ Á+ µ Ä ± µÅ Æ+Ç Æ È É¤¯ º ¼À+Ê Ë+Ì ÍzÎ Ï È Ë+Ì Ð ÉÑ Ò%Ó ² ±+¿ µ Ä ±+¶ ¶ ± º ²"·+¾ ¹+¯ ´+¶"¾ ¹ ¶¶ Ô ¹ Á+ ´z¾ ¯ ¶ È Ë+Ì Ð ÉÑ ² ´ ¶ Á  ¹%Ó² ±+¿ µ Ä ±+¶ ¶ ± º ²"·+¾ ¹+¯ ´+¶"¾ ¹ ¶Õ¤¾ ¯ ¶ À+´+¶ Á+ ¹ ´ Á  µ Ö Ö Ö Ö ´ Ö ± Ö ¿ Ö ¹ Ö ± Ö Á+Ö Â Ö Ö Ö Ö Ö Ö Ö Ö Ö ÖØ × Ù Ä ®+º º ¹ ± Á+ 53 54 ****************** Häufigkeitsverteilung für Vsumme ************; 55 TITLE1 'Häufigkeitsverteilung für die Variable VSumme'; RUN; 56 TITLE2 'mit SELECT und GROUP BY' ;RUN; 57 TITLE3 'COUNT(Vsumme) gibt missing values als 0 aus'; 58 PROC SQL; 59 SELECT Vsumme, COUNT(Vsumme) FROM saskurs.dat1 60 GROUP BY Vsumme; 61 QUIT; NOTE: The PROCEDURE SQL used 0.07 seconds. Ú Û+Ü Ý+Þ ß+à á Þ â+ã ä á%å â á Þ æ+Ü ç ß"Ý%è å é+Þ áê+ë%å Þ ë+ì æ áê+í+Ü î î+á î+Þ âí ð+ñ ð ò ó¤Ü ç éô+õ ö+÷ øzù ú ò ö+÷ û óü ê(ã Ü î î+á%ýß Þ+ì âî+Þ+ã ã Þ ç ß"ä+ë æ+Ü á+ã"ë æ ãþ¤ë Ü ã ê%á%å ãÿ í%Ü î î+á ÿ þ þ þ þ þ þ ïþ þ þ þ þ þ þ ïþþþ þ þ þ þ þ þ þ ï à 62 63 ****************** Häufigkeitsverteilung für Vsumme ************; 64 TITLE1 'Häufigkeitsverteilung für die Variable VSumme'; RUN; 65 TITLE2 'mit SELECT und GROUP BY' ;RUN; 66 TITLE3 'COUNT(*) gibt missing values als solche aus'; 67 PROC SQL; 68 SELECT Vsumme, COUNT(*) FROM saskurs.dat1 69 GROUP BY Vsumme; 70 QUIT; NOTE: The PROCEDURE SQL used 0.05 seconds. " # $ # % &' "( ) * + ,.- / % * + 0 &21 34 . " 5 6 7 . ! 2 8 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 8 : ! ; : :; ; < = ; ; : > ! ; : ? ; ; : @ ; ; : : @ ; ; : > ; ; ; : : ! ; ; ; : = ; ; ; ; : 71 72 73 ****************** VERWENDUNG VON ALIAS MIT AS ************; 74 TITLE1 'Kennzahlen für Geld getrennt nach Geschlecht'; RUN; 75 TITLE2 'erzeugt mit COUNT, AVG, MAX, MIN';RUN; 76 PROC SQL; 77 SELECT Geschl, 78 COUNT(*) as Anzahl, 79 AVG(Geld) AS Mittel LABEL="Geld, Mittelwert", 80 MAX(Geld) AS Maximum LABEL="Geld, Maximum", 81 MIN(Geld) AS Minimum LABEL="Geld, Minimum" 82 FROM saskurs.dat1 83 GROUP BY Geschl; 84 QUIT; NOTE: The PROCEDURE SQL used 0.14 seconds. 85 A B C C D E F G B CH I JK B G L.M B NOJ B C C N'C E P FK B Q P F G B P F N BJ D B S M N"T U N"V W X Y Z\[^] _ K\[a` ] bca [ `d Y K B Q P F o o o o o lB U T w C G B o o p G C G K B G L\[eK P F Ng]Y h ]Oi jk` U N N B G lBJ Nm` E n o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o U P F q r s t q s suq s U P F x t r q y t yzr s s O B G L\[eK U TS Tm` U C o o o o o o o o o o s s s s s s s s R B G Lf[ U T S T o o o o r v s s rs s 4.3 Subsets mit WHERE Mit WHERE können Teildatensätze bei der Übergabe der SAS-Datei an PROC SQL selektiert werden. Nur Variablen, die in der SAS-Datei vorhanden sind, können zur Selektierung verwendet werden. 86 ******* Kennzahlen fuer Geld mit DISTINCT und WHERE Bedingung *********; 87 TITLE1 'Kennzahlen für die Variable Geschlecht'; RUN; 88 TITLE2 'bei Personen, bei denen Geld >= 4000'; RUN; 89 TITLE3 'mit dem WHERE-Befehl';RUN; 90 PROC SQL; 91 SELECT DISTINCT geschl, COUNT(*), 92 SUM(Geld) AS summe LABEL="Geld, Summe", 93 AVG(Geld) AS mittel LABEL="Geld, Mittelwert", 94 MAX(Geld) AS Maximum LABEL="Geld, Maximum", 95 MIN(Geld) AS Minimum LABEL="Geld, Minimum" 96 FROM saskurs.dat1 97 WHERE Geld >= 4000 98 GROUP geschl; 99 QUIT; 100 NOTE: used { | } } ~ The | }PROCEDURE | SQL |" | 0.17 | seconds. | " | } | } | | } | } | | " | O | | | | ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ £| ¦u § } } z« ¬ ª \ |¢¡ | ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¨ ¦ | \e £O| m¡ ¤ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¦ © § u ¦ ¦ § z« | ¥ ¥ f | ¡ } ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ § f ¥ ¥ ¥ ¨ 101 *******Häufigkeitsverteilung für Geschlecht+Vorname bei Geld >= 1000 ******; 102 *******Sortiert nach Geschlecht und ANZAHL (Absteigend) ****************; 103 TITLE1 'Häufigkeitsverteilung für Geschlecht+Vorname bei Geld >= 1000'; RUN; 104 TITLE2 'Sortiert nach Anzahl (absteigend)';RUN; 105 PROC SQL; 106 SELECT Geschl, Vorname, COUNT(*) AS Anzahl LABEL="Anzahl" 107 FROM saskurs.dat1 108 WHERE Geld >= 1000 109 GROUP BY Geschl, Vorname 110 ORDER BY Geschl, Anzahl DESCENDING; 111 QUIT; 112 NOTE: SQL ­ ® ¯ ° ± ² ³ The ´ ± µ ¶ PROCEDURE · ´¸ µ ´ ± ¹ ¯ º ²° » ¸¼ used ´ ¶ ½ ¾ ¹ 0.14 ´ ½ ¾ µ ¿ À seconds. Á¸ º  à ´'Ä ´ ±¼ ´ ¹ Å'Æ Ç'È É É É Ë Á¸ ¼ ´ ¶ Ò Ò Ò Ó Ó Ó Ã Ã Ã Ã Ã Ã µ ± ½ ¾ Ò Ò ´ ± ´ ± ´ ± ® º ® º ® º ® º ® º ® º ´¸ ¹ ´ Ò Ò Ä ¹ Ä ¹ Ä ¹ º ¹ º ¹ º ¹ º ¹ º ¹ º ¹ . µ'º  ½ ¾ÌOº Í Â ¾ Ï ¹ Î Â Ä ¶ µ ´ ± ² ´ º Å Ð ½ ¾ µÑÀÁ¸ º  à ´ Ì º Í O  ¾ ¹ Ò Ò Ò Ò Ò Ò Ò Ò Ò Ò Ò Ò Ò Ò Ò Ò Ò Ò Ò Ò Ò Ò Ò Ò Ò Ò Ò ± ½ ¾Ô̺ Õ Â Ö ± ½ ¾Ñ× Â¸ ± Â È ± ½ ¾Ô̺ Ÿ ´ Â È ± ½ ¾Ô̺ Ÿ ´  ¶ Ö ± ½ ¾kØ ¸  º ³Ù Ú µ µ Á È ± ½ ¾kØ ¸ ± µ Í È ± ½ ¾ÜÛ¾ Á à  ¶ È ± ½ ¾Ñ× Â¸ ± Â È ± ½ ¾ÔÌO¹ °¸ ´ Å È Ê 4.4 Subsets mit HAVING Mit HAVING können Teile einer SQL-Tabelle selektiert werden, auch unter Verwendung von Variablen, die in der ursprünglichen SAS-Datei nicht vorhanden sind. 113 *************** bestimmte Leute auswählen mit HAVING **************; 114 TITLE1 'Name, Vorname, Geld, Vsumme und Differenz'; RUN; 115 TITLE2 'bei Personen, die Vsumme > 3000 haben'; RUN; 116 TITLE3 'Auswahl mit HAVING möglich, da neue Variable Differenz benutzt wird';RUN; 117 PROC SQL; 118 SELECT Name, Vorname, Geld, Vsumme, 119 (Geld-Vsumme) AS Diff LABEL="Differenz Geld-VSumme" 120 FROM saskurs.dat1 121 HAVING Diff > 3000 122 ORDER BY Diff; 123 ; 124 QUIT; NOTE: The PROCEDURE SQL used 0.1 seconds. 125 Ý Þ ß à\áãâä å æ Þ ß à\áèç à é ê\áèâë ì ß ß à'ì æ ê.í î ï ï àå à æ ð ò à " î ó àå ë ä æ à æáaê î à"í î ï ï.ôõ ö ö ö'÷ Þ ò à æ ø ì ë ùOÞ ÷ éß î ú.û ø âOü Ý ç"ß ý þ é î ÿ ÷áaê Þ.æ à ì àâÞ å î Þ ò é à.í î ï ï à å à æ ð ò à æ ì ú ð úùîå ê Ý Þ ß à â äå æ Þ ß à Þå ä æ ø é ïå à ê ÿ ÷ ß î ú ð å Þ æ ú ú ä ç Þ ì ê î øOæ Þ Þå ä æ Þå î Þ úOå ì æ ð ÷ ä ß Þ ë ä à é é àå øOæ êå à Þ ë í î ï ï àå à æ ð ç à é êkâà å ë ì ß ß àkç à é ê â ì ß ß à ö ö õ ö ö ö ö ö ö ö ö ö ö ö ö ö ö ö ö ö ö ö ö ö ö ö ö ö ö ö ö ö õ ö ö ö ö ö ö ö ö ö õ õ ö ö õ ö ö ö ö õ ñ ö ö ö ö ö ö ñ ö ö ö ö ñ 4.5 JOIN : Zusammenfügung von Tabellen 126 ***************** "Join" ***********************************; 127 * Zunaechst werden erstmal zwei Dateien erzeugt,; 128 * damit man zwei Dateien zusammenfuegen kann; 129 DATA saskurs.dat2; 130 SET saskurs.dat1; 131 KEEP id Name Vorname Geschl Gebdat; 132 RUN; NOTE: The data set SASKURS.DAT2 has 12 observations and 5 variables. NOTE: The DATA statement used 0.19 seconds. 133 PROC 134 BY 135 RUN; NOTE: The NOTE: The SORT DATA=saskurs.dat2; Gebdat; data set SASKURS.DAT2 has 12 observations and 5 variables. PROCEDURE SORT used 0.16 seconds. 136 DATA saskurs.dat3; 137 SET saskurs.dat1; 138 KEEP id Geld Vsumme; 139 RUN; NOTE: The data set SASKURS.DAT3 has 12 observations and 3 variables. NOTE: The DATA statement used 0.19 seconds. 140 PROC 141 BY 142 RUN; NOTE: The NOTE: The 143 SORT DATA=saskurs.dat3; Geld; data set SASKURS.DAT3 has 12 observations and 3 variables. PROCEDURE SORT used 0.13 seconds. Ohne WHERE erstellt PROC SQL das kartesische Produkt aus den einzelnen Dateien, was zu extrem großen Tabellen führen kann. I.a. wird man deshalb eine WHERE-Bedingung verwenden. Zunächst ein Gegenbeispiel ohne WHERE. Ohne Angabe der Quelldatei wählt SELECT selbständig eine geeignete Quelldatei aus (im Beispiel dat2 bzw. dat3). 144 **** "UNSINNIGES BZW. FEHLERHAFTES Join" *********************************** ; 145 TITLE1 ’FEHLERHAFTE Zusammenfassung zweier Tabellen’; RUN; 146 TITLE2 ’Da die Dateien verschieden geordnet sind, fehlt hier’; 147 TITLE3 ’IRRTUEMLICH die WHERE-Bedingung dat2.id=dat3.id.’; 148 TITLE4 ’Ausserdem wird so das kartesische Produkt erstellt.’; 149 TITLE5 ’Vorsicht: Gefahr extrem grosser Tabellen n1*n2’; RUN; 150 PROC SQL; 151 SELECT dat2.id, dat2.Name, Vorname, Geschl, Gebdat, 152 dat3.VSumme, Geld 153 FROM saskurs.dat2, saskurs.dat3 154 QUIT; 155 NOTE: The execution of this query involves performing one or more Kartesian product joins that can not be optimized. ! !" 0 1) "'0 2 " ) "#+3"* ; < = ; > 1) "@? "* 1" !+()* 17 61 K6* ) 45 2EL:M" $5 *+" N ;Q 0 P !" U U U U U U U U U U U U U U U . .V= 6 " - GXB * 6# \QM 1) _V# 1* " [RM 1) .dT4 5 !) bXB * 6# CQT4 5 !) ^XJ " 2& 6 . /X= 6 " - . CQT 2* # ]f # % . .V= 6 " - GXB * 6# \QM 1) _V# 1* " [RM 1) .dT4 5 !) bXB * 6# CQT4 5 !) ^XJ " 2& 6 . /X= 6 " - . CQT 2* # ]f # % . .V= 6 " - GXB * 6# \QM 1) _V# 1* " [RM 1) .dT4 5 !) bXB * 6# CQT4 5 !) U U "* 6 2 2& 2& - 1 "* & "* 6 2 2& 2& - 1 "* & "* 6 2 2& 2& # $ # %'& 45 ) " 1 "#% " A B " 1) # % IH * 2 " ) 2* " !'%* 6 (" ) "*+ , " - - "# 6* 1# " 27 ) # 198:$ "5 - 7 2 5 ) "* # %1 2 CED ) 1F 1 2 G9D ) 9 1 D 4 5 "IJ* 6 1 H 2'"* 2 " - - 2ED "*@ , " - - "#I#. O # C K6* # !" U U U U U U U U U U U U U U # 1* " - $* " 1 * ) 2& 2)`= * ) # c # 1* " = * ) * # HA e # 1* " # 1* " 5 6 ! # c # 1* " - $* " 1 * ) 2& 2)`= * ) # c # 1* " = * ) * # HA e # 1* " # 1* " 5 6 ! # c # 1* " - $* " 1 * ) 2& 2)`= * ) # c # 1* " = * ) * # HA e M" 45 U U U U U U U U U U U U ! W# ! W# ! W# ! W# (" ) (" ) (" ) 2 2 6 ! W# ! W# ! W# ! W# (" ) ! W# ! W# ! W# ! W# (" ) (" ) (" ) 2 2 6 ! W# ! W# ! W# ! W# (" ) ! W# ! W# ! W# ! W# (" ) (" ) (" ) 2 2 6 ! W# - " U U # # # # , , , # # # # , # # # # , , , # # # # , # # # # , , , # - 4 5 2QM" , * 2 1 U U U U U U U U U U U U U U ) 45 ) 45Y. .Z /[Z . ) 45Y. GZ / ^Z . ) 45a/.Z / bZ . ) 45Y. .Z / ^Z . ) 45a/.Z . . Z . ) 45Y. CZ / ^Z . ) 45Y. .Z . CZ . ) 45a/.Z / bZ . ) 45a/.Z / ^Z . ) 45Y. ^Z /[Z . ) 45a/.Z / bZ . ) 45 ) 45Y. .Z /[Z . ) 45Y. GZ / ^Z . ) 45a/.Z / bZ . ) 45Y. .Z / ^Z . ) 45a/.Z . . Z . ) 45Y. CZ / ^Z . ) 45Y. .Z . CZ . ) 45a/.Z / bZ . ) 45a/.Z / ^Z . ) 45Y. ^Z /[Z . ) 45a/.Z / bZ . ) 45 ) 45Y. .Z /[Z . ) 45Y. GZ / ^Z . ) 45a/.Z / bZ . ) 45Y. .Z / ^Z . ) 45a/.Z . . Z . ) 45Y. CZ / ^Z . ) 45Y. .Z . CZ . ./ 2 R ! K"* S D T U U U U U U U U U U U U D \ ]. \ ] G \ ][ \ _. \ _. \ _ C \ _ C \ _ ^ \ _ ] \ _ _ \ _ _ D \ ]. \ ] G \ ][ \ _. \ _. \ _ C \ _ C \ _ ^ \ _ ] \ _ _ \ _ _ D \ ]. \ ] G \ ][ \ _. \ _. \ _ C \ _ C ! ! " M" U U U U U U U U U U U U D . D . D . D . D . D . D . D . D . D . D . D . ] / .G ] / .G ] / .G ] / .G ] / .G ] / .G ] / .G ] / .G ] / .G ] / .G ] / .G ] / .G ./ / .] ./ / .] ./ / .] ./ / .] ./ / .] ./ / .] ./ / .] ./ / .] - 1 U U / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / g h i j h k i lg m hno p q r rs ~ q y s'~ q s y st+sz p k k m h j iy s@i h lo p p sz s r+xyz 7p z p y E:s uq z+s Q ~ q rs X s w } X s | | } Q z o t ¢fj q t v } }V s | | X qz t Qq o y ¡Vlt z s £Rq o y }d ry X qz t Q ry X s w } X s | | } Q z o t ¢fj q t v } }V s | | X qz t Qq o y ¡Vlt z s £Rq o y }d ry X qz t Q ry X s w } X s | | } Q z o t ¢fj q t v } }V s | | X qz t Qq o y ¡Vlt z s | sz w sz w w | sz w sz w w | sz w sz t uq p p o t v'w y s stv s k h s y t vo qpI qz sp y z s r'vz p p xs y sz+m q{ s | | st z t s 7p y t 9 :u s | 7 y sz t v q E y q 9 y 9 p sIz o 'sz p s | | E sz@m q{ s | | stIt} t z t q rs sp lt z s qp r t lt z s qp r t m rq p r t lt ¤ q xs y lt z s qp r t l| uz s r t gz y w r t y` qz y q r t lt ¤ q xs y lt z s q xs y qz y q xs y gz qt ¦ r t lt z s qp r t lt z s qp r t m rq p r t lt ¤ q xs y lt z s qp r t l| uz s r t gz y w r t y` qz y q r t lt ¤ q xs y lt z s q xs y qz y q xs y gz qt ¦ r t lt z s qp r t lt z s qp r t m rq p r t lt ¤ q xs y lt z s qp r t l| uz s r t gz y w r t y` qz y q r t | s t | t | t | { | t | t | t | t | { | { | { | t | t | t | t | { | t | t | t | t | { | { | { | t | t | t | t | { | t | t | t | t | Qs { oz p q y a} } y a} } y Y} £ } y a} } y y Y} } £ } y Y} } y ¥} } y Y} } } y a} } } } y Y} } y Y} } } } y a} } y a} } y Y} £ } y a} } y y Y} } £ } y Y} } y a} } y Y} } } y a} } } } y Y} } y Y} } } } y a} } y a} } y Y} £ } y a} } y y Y} } £ } y Y} } y a} } } } o ¡ ¡ ¡ ¡ rRsz S p o ¢ ¡ ¡ ¢} ¢ ¢£ ¡} ¡} ¡ ¡ ¡ ¡ ¢ ¡ ¡ ¡ ¡ ¢} ¢ ¢£ ¡} ¡} ¡ ¡ ¡ ¡ ¢ ¡ ¡ ¡ ¡ ¢} ¢ ¢£ r r } } } } } } } } } } } } } } } } ¢ ¢ ¢ ¢ s s }¢ }¢ }¢ }¢ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ | § ¨ © ª ¨ « © ¬§ ­ ¨®¯ ° ± ² ²³ ¿ ± À¹ ³'¿ ± Á ³ ¹ ³´+³º ° Ç « « ­È ¨ ɪ Ç Ê ©À¹ ³@Ë© ¨ ¬¯ ° ° ³º À³ ²+¸¹º À7° ÅÀ Óź ° ¹ ÃÄ ÁEÔ:Õ³ µ±Ä º+³ Ö ÇQ ¿ Ø ± ²³ Ú Ú Ú Ú Ú Ú Ú Ú Ú Ú Ú Ú Ú Ú Ú ÛRÕ± ¯ À¹ ½dÙÃ Ä ²¹ ãXÍ ±º Å´ ¾QÙÃ Ä ²¹ ßXÒ ³ Á· Å ½ ÞXÉ Å ³ ¼ ¼ ½ ¾QÙ Áº ¯ ´ âfª ± ´ ¶ ½ ½VÉ Å ³ ¼ ¼ ÐXÍ ±º Å´ àQÕ± ¯ À¹ áV¬´ Àº ³ ÛRÕ± ¯ À¹ ½dÙÃ Ä ²¹ ãXÍ ±º Å´ ¾QÙÃ Ä ²¹ ßXÒ ³ Á· Å ½ ÞXÉ Å ³ ¼ ¼ ½ ¾QÙ Áº ¯ ´ âfª ± ´ ¶ ½ ½VÉ Å ³ ¼ ¼ ÐXÍ ±º Å´ àQÕ± ¯ À¹ áV¬´ Àº ³ ÛRÕ± ¯ À¹ ½dÙÃ Ä ²¹ ãXÍ ±º Å´ ¾QÙÃ Ä ²¹ ßXÒ ³ Á· Å ½ ÞXÉ Å ³ ¼ ¼ ½ ¾QÙ Áº ¯ ´ âfª ± ´ ¶ Ú Ú Á· Á· ¼ À ³º · ³º Å Á Á· Á· ¼ À ³º · ³º Å Á Á· Á· ¼ À ³º · ´ µ± ° ° ¯ ´ ¶'· ÃÄ ¹ ³ À ³´¶ ³ « ¨Ì Í ³ À¹ ´ ¶¯ ±°IÑ ±º Á ³° ¹ Áº ³ ²'¶º Å° ° ¸³ ¹ ³º+­ ±» ³ ¼ ¼ ³´ ź À´ ³ Á7° ¹ ´ À9Æ:µ ³Ä ¼ 7 Á Ä ¹ ³º ´ ¶À ± Á ¾EÎ ¹ ÀÏ À ± Á Ð9Î ¹ 9 À Î ° Ã Ä ³IÒº Å À¯ Ñ Á'³º ° Á ³ ¼ ¼ ÁEÎ ³º@­ ±» ³ ¼ ¼ ³´I´½ × ´ ¾ Óź ´ ± ²³ Ú Ú Ú Ú Ú Ú Ú Ú Ú Ú Ú Ú Ú Ú ¬´ Ü ± ¬´ Àº ³ ± É ±º ¹ ± §º ±´ ÑÌ ä ¬´ Àº ³ ±° ¬´ Àº ³ ±° ­Ä Å ²± ° ¬´ Ü ± ¬´ Àº ³ ±° ¬¼ µº ³ À §º ¹ Á· Á¹`É ±º ¹ ± ¬´ Ü ± ¬´ Àº ³ ± É ±º ¹ ± §º ±´ ÑÌ ä ¬´ Àº ³ ±° ¬´ Àº ³ ±° ­Ä Å ²± ° ¬´ Ü ± ¬´ Àº ³ ±° ¬¼ µº ³ À §º ¹ Á· Á¹`É ±º ¹ ± ¬´ Ü ± ¬´ Àº ³ ± É ±º ¹ ± §º ±´ ÑÌ ä ¬´ Àº ³ ±° ¬´ Àº ³ ±° ­Ä Å ²± ° ¬´ Ü ± Õ³° ÃÄ Ú Ú Ú Ú Ú Ú Ú Ú Ú Ú Ú Ú ¸³ ¹ ¸³ ¹ ¸³ ¹ Á Á Å ² å´ ² å´ ² å´ ² å´ ¸³ ¹ ² å´ ² å´ ² å´ ² å´ ¸³ ¹ ¸³ ¹ ¸³ ¹ Á Á Å ² å´ ² å´ ² å´ ² å´ ¸³ ¹ ² å´ ² å´ ² å´ ² å´ ¸³ ¹ ¸³ ¹ ¸³ ¹ Á Á Å ² å´ ² å´ ² å´ ² å´ ¸³ ¹ ¼ ³ Ú Ú » ¼ » ¼ » ¼ ´ ¼ ´ ¼ ´ ¼ ´ ¼ » ¼ ´ ¼ ´ ¼ ´ ¼ ´ ¼ » ¼ » ¼ » ¼ ´ ¼ ´ ¼ ´ ¼ ´ ¼ » ¼ ´ ¼ ´ ¼ ´ ¼ ´ ¼ » ¼ » ¼ » ¼ ´ ¼ ´ ¼ ´ ¼ ´ ¼ » ¼ Ã Ä ÁQÕ³ » ¯º Á° À± Ú Ú Ú Ú Ú Ú Ú Ú Ú Ú Ú Ú Ú Ú ¹ ÃÄY½ ½Ý Þ ßÝ ½ ¹ ÃÄaÞ½Ý ½ ½ Ý ½ ¹ ÃÄY½ ¾Ý Þ ßÝ ½ ¹ ÃÄY½ ½Ý ½ ¾Ý ½ ¹ ÃÄaÞ½Ý Þ ãÝ ½ ¹ ÃÄaÞ½Ý Þ ßÝ ½ ¹ ÃÄY½ ßÝ ÞÛÝ ½ ¹ ÃÄaÞ½Ý Þ ãÝ ½ ¹ ÃÄ ¹ ÃÄY½ ½Ý ÞÛÝ ½ ¹ ÃÄY½ ÐÝ Þ ßÝ ½ ¹ ÃÄaÞ½Ý Þ ãÝ ½ ¹ ÃÄY½ ½Ý Þ ßÝ ½ ¹ ÃÄaÞ½Ý ½ ½ Ý ½ ¹ ÃÄY½ ¾Ý Þ ßÝ ½ ¹ ÃÄY½ ½Ý ½ ¾Ý ½ ¹ ÃÄaÞ½Ý Þ ãÝ ½ ¹ ÃÄaÞ½Ý Þ ßÝ ½ ¹ ÃÄY½ ßÝ ÞÛÝ ½ ¹ ÃÄaÞ½Ý Þ ãÝ ½ ¹ ÃÄ ¹ ÃÄY½ ½Ý ÞÛÝ ½ ¹ ÃÄY½ ÐÝ Þ ßÝ ½ ¹ ÃÄaÞ½Ý Þ ãÝ ½ ¹ ÃÄY½ ½Ý Þ ßÝ ½ ¹ ÃÄaÞ½Ý ½ ½ Ý ½ ¹ ÃÄY½ ¾Ý Þ ßÝ ½ ¹ ÃÄY½ ½Ý ½ ¾Ý ½ ¹ ÃÄaÞ½Ý Þ ãÝ ½ ¹ ÃÄaÞ½Ý Þ ßÝ ½ ¹ ÃÄY½ ßÝ ÞÛÝ ½ ¹ ÃÄaÞ½Ý Þ ãÝ ½ ½¾ Á¯ ²RÓ³º S ° Î Ù¯ Ú Ú Ú Ú Ú Ú Ú Ú Ú Ú Ú Ú à á½ à á½ à á ¾ à á ¾ à á ß à á â à á á à á á Î à â½ à â Ð à âÛ à á½ à á½ à á ¾ à á ¾ à á ß à á â à á á à á á Î ½ à â½ ½ à â Ð ½ à âÛ ½ à á½ ½ à á½ ½ à á ¾ ½ à á ¾ ½ à á ß ½ à á â ½ à á á ½ à á á ½ ² ² Ú Ú ß â ß â ß â ß â ß â ß â ß â ß â á Þ á Þ á Þ á Þ á Þ á Þ á Þ á Þ á Þ á Þ á Þ á Þ Û Þ Û Þ Û Þ Û Þ Û Þ Û Þ Û Þ Û Þ Û Þ Û Þ Û Þ Û Þ ³ Õ³ Ú Ú Ú Ú Ú Ú Ú Ú Ú Ú Þ Ð Þ Þ Ð Þ Þ Ð Þ Þ Ð Þ Þ Ð Þ Þ Ð Þ Þ Ð Þ Þ Ð Þ Þ ß Þ Þ ß Þ Þ ß Þ Þ ß Þ Þ ß Þ Þ ß Þ Þ ß Þ Þ ß Þ Þ ß Þ Þ ß Þ Þ ß Þ Þ ß Þ Þ â Þ Þ â Þ Þ â Þ Þ â Þ Þ â Þ Þ â Þ Þ â Þ Þ â Þ Þ â Þ Þ â Þ Þ â Þ Þ â Þ ¼ À Ú Ú Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ Þ æ ç è é ç ê è ëæ ì çíî ï ð ñ ñò þ ð ÿø ò'þ ð ò ø òóòù ï ê ê ì ç é èÿø òè ç ëî ï ï òù ÿò ñ+÷øù ÿ7ï ÿ ù ï ø ò ôð ù+ò ó ôð ï ï î ó õ'ö ÷ò ø òù+ì ðú ò û û òó ø ò ÿ òóõ ò ù ÿó ò 7ï ø ó ÿ:ô ò û ø òù ê ç ò ÿø ó õî ó õÿ ð ø ÿ ÿ ð ý ø ÿ ðï ðù òï ø ï ò ù ÿî 'òù ï ò û û ù ò ñ'õù ï ï òù@ì ðú ò û û òóIóü ó þ"! ð ñò ù ó ð ñò òï û ò "ò ú îù ï ÿð î ñ#òù ï$ %î ñ ñ ò ò û ÿ & & & & & & & ü & ü' & & & & & ò & û & û & ò& ù & & & & & & & &ë& ó &ÿ& ù & ò & ð& ï & & & & & & & & & &ñ & ( & ó & ó & û & ø & & & & & & & & & & & & & & & & & & & & & & & & & & ) &* &* & & & & & & & &+ &ý &* &* ý, ðù ó ëû ôù ò ÿ ñ ( ó ó û ø Y ü ü- *)- ü . + ü )** +ý** ."ð î ÿø æù ø ö ñ ( ó ó û ø Y ü ý- * /0- ü . + ý )** +ý** 1Vëó ÿù ò ø2 ðù ø ð ñ ( ó ó û ø 3* ü- * 40- ü . +) )** +ý** )#ð î ÿø ëó 5 ð ÷ò ø ú û ø Y ü ü- * /0- ü . 1 ü )** +ý** ü6% ñø ö ëó ÿù ò ð ÷ò ø ú û ø 3* ü- ü ü - ü . 1 ü )** +ý** 4, ðù ó ðù ø ð ÷ò ø ú û ø Y ü - * /0- ü . 1 )** +ý** "% ñø ö æù ðó 7 ñ ( ó ó û ø Y ü ü- ü 0- ü . 1 )** +ý** /, ò ö û ÿ ëó ÿù ò ðï ñ ( ó ó û ø 3* ü- * 40- ü . 1 / )** +ý** ü *, ò û û òù ëó ÿù ò ðï ñ ( ó ó û ø 3* ü- * /0- ü . 1 + )** +ý** ü "% ù î ó ö ì ñð ï ñ ( ó ó û ø Y ü /- *)- ü . 1 1 )** +ý** + éðóõ f ëó 5 ð ÷ò ø ú û ø 3* ü- * 40- ü . 1 1 )** +ý** ü ü' ò û û òù ëó ÿù ò ðï ñ ( ó ó û ø / * * *8/ * * * * * ý, ðù ó ëû ôù ò ÿ ñ ( ó ó û ø Y ü ü- *)- ü . + ü / * * *8/ * * * * * ." ð î ÿø æù ø ö ñ ( ó ó û ø Y ü ý- * /0- ü . + ý / * * *8/ * * * * * 1 ëó ÿù ò ø2 ðù ø ð V ñ ( ó ó û ø 3* ü- * 40- ü . +) / * * *8/ * * * * * )# ð î ÿø ëó 5 ð ÷ò ø ú û ø Y ü ü- * /0- ü . 1 ü / * * *8/ * * * * * ü6% ñø ö ëó ÿù ò ð ÷ò ø ú û ø 3* ü- ü ü - ü . 1 ü / * * *8/ * * * * * 4, ðù ó ðù ø ð ÷ò ø ú û ø Y ü - * /0- ü . 1 / * * *8/ * * * * * "% ñø ö æù ðó 7 ñ ( ó ó û ø Y ü ü- ü 0- ü . 1 / * * *8/ * * * * * /, ò ö û ÿ ëó ÿù ò ðï ñ ( ó ó û ø 3* ü- * 40- ü . 1 / / * * *8/ * * * * * ü *, ò û û òù ëó ÿù ò ðï ñ ( ó ó û ø 3* ü- * /0- ü . 1 + / * * *8/ * * * * * ü "% ù î ó ö ì ñð ï ñ ( ó ó û ø Y ü /- *)- ü . 1 1 / * * *8/ * * * * * + éðóõ f ëó 5 ð ÷ò ø ú û ø 3* ü- * 40- ü . 1 1 / * * *8/ * * * * * ü ü' ò û û òù ëó ÿù ò ðï ñ ( ó ó û ø ü + * * *9) * * * * * ý, ðù ó ëû ôù ò ÿ ñ ( ó ó û ø Y ü ü- *)- ü . + ü ü + * * *9) * * * * * ." ð î ÿø æù ø ö ñ ( ó ó û ø Y ü ý- * /0- ü . + ý ü + * * *9) * * * * * 1 ëó ÿù ò ø2 ðù ø ð V ñ ( ó ó û ø 3* ü- * 40- ü . +) ü + * * *9) * * * * * )# ð î ÿø ëó 5 ð ÷ò ø ú û ø Y ü ü- * /0- ü . 1 ü ü + * * *9) * * * * * ü6% ñø ö ëó ÿù ò ð ÷ò ø ú û ø 3* ü- ü ü - ü . 1 ü ü + * * *9) * * * * * 4, ðù ó ðù ø ð ÷ò ø ú û ø Y ü - * /0- ü . 1 ü + * * *9) * * * * * "% ñø ö æù ðó 7 ñ ( ó ó û ø Y ü ü- ü 0- ü . 1 ü + * * *9) * * * * * üý : ; < = ; > < ?0: @ ;BAC D E F FG H IE D D C H JLK M0G N GO@ EP G Q Q GH T EBUN GLT E V G N GHWGO D XY N G U GHBJ G ZO UH G VD N H U[I GY Q VY N GO \ > > @] ; ^= \ _ <BUN G`< ; > ;a b G UN H JC H JBU E V cd N Ue U E V fd N Ud ?C D D GO UG FM0NO UD ZBU EDg EO V GD N D X Y GhO Z UC g VLGO D V G Q Q Vd iZO D N XY VjkG IEY OG l V0O G FLJO ZD D GO@ EP G Q Q GHHR m H c \ T"n E FG iZO H E FG kGD XY Q G X Y V"kG P CO VD UE VC F#iGO D$d oC F F G kG Q U p p p p p p p pS, p p p h p G pVp K p Z p Q pU p p p p p p p p?p H pU0p O p G p Ep D p p p p p p p p p pF p qp H p H p Q p N p Xp Y3 p p p p pr0p Rp s pr pt0p s p R pu pv pS p p p p p p p p R pw pr pr pr9 p p p p p p x pr pr pr pr pr R r,^ Z G Q Q GO ?H U0O G ED F qH H Q N XY3r0Rs r S0s R u v w R w r r r9x r r r r r R c"o VO C H K @Y Z FE D F qH H Q N XYyR Ss rxs R u v v R w r r r9x r r r r r wz= E H J ?H { E MG N P Q N XY3r0Rs r t0s R u v v R w r r r9x r r r r r R R'^ Z G Q Q GO ?H U0O G ED F qH H Q N XY d f r r r r|R r r r r r r f,b EO ZH ?0Q I0O G U F qH H Q N XYyR Rs rxs R u w0R f r r r r|R r r r r r r u"kE C UN :O N VK F qH H Q N XYyR fs r S0s R u w f f r r r r|R r r r r r r v'?H U0O G Z V VN2^ EO N E F qH H Q N XY3r0Rs r t0s R u wx f r r r r|R r r r r r r x#kE C UN ?H { E MG N P Q N XYyR Rs r S0s R u v0R f r r r r|R r r r r r r R6oX Y FN VK ?H U0O G E MG N P Q N XY3r0Rs R R s R u v0R f r r r r|R r r r r r r t,b EO ZH ^ EO N E MG N P Q N XYyR cs r S0s R u v c f r r r r|R r r r r r r c"oX Y FN VK :O EH ga } V V Z F qH H Q N XYyR Rs R c0s R u v c f r r r r|R r r r r r r S,h G VK Z Q U ?H U0O G ED F qH H Q N XY3r0Rs r t0s R u v S f r r r r|R r r r r r r R r,^ Z G Q Q GO ?H U0O G ED F qH H Q N XY3r0Rs r S0s R u v w f r r r r|R r r r r r r R c"o VO C H K @Y Z FE D F qH H Q N XYyR Ss rxs R u v v f r r r r|R r r r r r r wz= E H J ?H { E MG N P Q N XY3r0Rs r t0s R u v v f r r r r|R r r r r r r RS Nun wird ein sinnvolles Beispiel zur Zusammenfügung mehrerer Tabellen unter Verwendung einer WHERE-Bedingung angegeben. 156 ***************** "Join" *********************************** ; 157 TITLE1 ’Korrekte Zusammenfassung zweier Tabellen’; 158 TITLE2 ’WHERE-Befehl, um die richtigen zuzuordnen’; 159 TITLE3 ’Da nichts anderes spezifiziert, in der Reihenfolge der 1. Datei’; RUN; 160 PROC SQL; 161 SELECT dat2.id, dat2.Name, Vorname, Geschl, Gebdat, 162 dat3.VSumme, Geld 163 FROM saskurs.dat2, saskurs.dat3 164 WHERE dat2.id=dat3.id; 165 QUIT; NOTE: The PROCEDURE SQL used 0.14 seconds. NOTE: PROC SQL statements are executed immediately; The RUN statement has no effect. NOTE: The PROCEDURE SQL used 0.34 seconds. ~ B 0 0 0 $ B L B ¡ ¢ B B £¢ ¤ "¥ ¦ § "§ #¦ $£ ¨ § © © © © © © © © ' © © © ª © © © © © © © © © © © © © ©«© ©0© © © © © © © © © © © © © © © ¬© © © © © © © © © © © © © © © © © © © © £ © © © © © © © © © © © © £ © © © © © © © © © ©­ ©­ ®, «0 0 ¬ y ¯ ­°¯ ± 0 °­­ ­­­ ±"§ ² ¬ y ®¯ ­ ³0¯ ± ® ³­ ®­­­ ´'« 0 2ª ¬ 3­0¯ ­ µ0¯ ± ° ®­­ ¶´­­ °#§ « · y ¯ ­ ³0¯ ± ´0 °­­ ®­­ 6¨ « 0 3­0¯ ¯ ± ´0 ­­ ®­­­ µ, ª y ¶¯ ­ ³0¯ ± ´ ¶ ³ ­ ­ ­8³ ­ ­ ­ ­ ­ ¶"¨ ² ¸ ¬ y ¯ ¶0¯ ± ´ ¶ ´­­ ³­­­ ³,¹ « 0 ¬ 3­0¯ ­ µ0¯ ± ´ ³ ­­ ­­ ­,ª « 0 ¬ 3­0¯ ­ ³0¯ ± ´ ® ­ ­ ­ ­| ­ ­ ­ ­ ­ ­ ¶"¨ ¬ y ³¯ ­°¯ ± ´ ´ ­ ­ ­9° ­ ­ ­ ­ ­ zº « · 3­0¯ ­ µ0¯ ± ´ ´ ­ ®­­ 166 Nun folgt ein Beispiel für die Zusammenfassung von Tabellen mit anschließender Sortierung. 167 ***************** "Join mit Sortierung" ******************** ; 168 TITLE1 ’Zusammenfassen zweier Tabellen’; RUN; 169 TITLE2 ’WHERE-Befehl, um die richtigen zuzuordnen’; 170 TITLE3 ’Sortiert nach Name, Vorname, Geburtsdatum’; RUN; 171 PROC SQL; 172 SELECT dat2.id, dat2.Name, Vorname, Geschl, Gebdat, 173 dat3.VSumme, Geld 174 FROM saskurs.dat2, saskurs.dat3 175 WHERE dat2.id=dat3.id 176 ORDER BY Name, Vorname, Gebdat; 177 QUIT; NOTE: The PROCEDURE SQL used 0.14 seconds. »¼ ½ ¾ ¿ ¿ÀÁ ¾ ½ ½ ÀÁBà ÄÀ Å ÀÆǾ È À É É À Á Ì0Í Î Ï Î0Ð Ñ À ÂÀ Ò É$Ó¼ ¿ÔÅ ÀÆ Å Õ Ò Ö Å × À ÁBü ü ØÆ ÔÁ ÀÁ ÙØÆ ÖÅ ÀÆ ÖÁ ¾ Õ ÒÚ ¾ ¿ ÀÓÜÛØÆ Á ¾ ¿ ÀÓÝÀ È ¼ Æ Ö½ Ô¾ Ö¼ ¿ Þ ß"Ú ¾ ¿À ÛØÆ Á ¾ ¿À ÝÀ½ ÕÒ É À Õ Ò Ö"ÝÀ È ¼Æ Ö½ Ô¾ Ö¼ ¿#ÛÀÆ ½$à Ù¼ ¿ ¿ À ÝÀ É Ô á á á á á á á áË' á á áâá Á áÔ0á Æ á À á Ø áÖ áÖá Å2 á á á á á á ã á ¾á Æ á Å á ¾ á á á á á á á á á á á á¿ á äá Á á Á á É á Å á Õá Ò3 á á á á áå0á Êá æ áå áç0á æ á Ê áè áéá ê á á á á á á á á á áë áå áå á á á á á á á áì áË áå áå ë,Ñ ¾Æ ØÁ â0É Â0Æ À Ô ¿ äÁ Á É Å ÕÒyÊ Êæ åêæ Ê è é0Ê Êêåå éååå ç,Ñ ¾Æ ØÁ ã ¾Æ Å ¾ ÄÀ Å È É Å ÕÒyÊ ìæ å í0æ Ê è Ë ì í å å å8í å å å å å ê#ݾ ¼ ÔÅ âÁ î ¾ ÄÀ Å È É Å ÕÒyÊ Êæ å í0æ Ê è Ë0Ê êåå éëåå è"ݾ ¼ ÔÅ ïÆ Å Öà ¿ äÁ Á É Å ÕÒyÊ ëæ å í0æ Ê è é ë íéå ëååå ézð ¾ Á × âÁ î ¾ ÄÀ Å È É Å ÕÒ3å0Êæ å ç0æ Ê è Ë Ë éå Êëåå Ê Ê'ã Ø À É É ÀÆ âÁ Ô0Æ À ¾½ ¿ äÁ Á É Å ÕÒ à à Êåå Ê å,ã Ø À É É ÀÆ âÁ Ô0Æ À ¾½ ¿ äÁ Á É Å ÕÒ3å0Êæ å í0æ Ê è Ë é ë å å å å|Ê å å å å å å í,ñ À ÖÃ Ø É Ô âÁ Ô0Æ À ¾½ ¿ äÁ Á É Å ÕÒ3å0Êæ å ç0æ Ê è Ë í Êåå Êéåå Ê6ÙÕ Ò ¿Å Öà âÁ Ô0Æ À ¾ ÄÀ Å È É Å ÕÒ3å0Êæ Ê Ê æ Ê è Ë0Ê Êåå ëååå ì"ÙÕ Ò ¿Å Öà ïÆ ¾Á òÐ ó Ö Ö Ø ¿ äÁ Á É Å ÕÒyÊ Êæ Ê ì0æ Ê è Ë ì Ëåå íååå Ê ì"Ù ÖÆ ¼ Á à ÇÒ Ø ¿¾ ½ ¿ äÁ Á É Å ÕÒyÊ íæ åêæ Ê è Ë Ë Ê é å å å9ê å å å å å 178 ÊË Nun folgt ein Beispiel für die Verwendung von ALIAS. 179 ***************** "Join" mit alias ************************** ; 180 TITLE1 ’Zusammenfassen zweier Tabellen’ ; RUN; 181 TITLE2 ’Verwendung von ALIAS fuer die verwendeten Dateien’;RUN; 182 PROC SQL; 183 SELECT dat2.id, dat2.Name, Vorname, Geschl, Gebdat, 184 dat3.VSumme, Geld 185 FROM saskurs.dat2 AS Persdat, saskurs.dat3 AS Gelddat 186 WHERE Persdat.id = Gelddat.id; 187 QUIT; NOTE: The PROCEDURE SQL used 0.13 seconds. ô õ ö ÷ ø øùú û÷ ö ö ùúBü ýù þ ùÿ÷ ù ù ú ùÿ ý0ù ú õ ú ú Lûõ ùÿþ ù ùÿ ý0ùú ù ùú ÷ ù þ ù ú ÷ øù ÿ ú ÷ øù ùö ù ù õÿ ö ÷ õ øùÿ ö õ ø ø ù ù ù ù ÿ ú 0 ÿ ù ÷ ö ø ! ú ú þ " " #%$ ÷ÿ ú & û0ÿ ù ø !ú ú þ ' ( "( ) *& "" *""" )÷ õ þ +ÿ þ ü ø !ú ú þ ' #( " ,&( ) * # ,*" #""" - ú 0ÿ ù þ. ÷ÿ þ ÷ ø !ú ú þ /"&( " 0&( ) * #"" 1-"" ÷ õ þ ú 2 ÷ ýù þ þ ' ( " ,&( ) -& "" *#"" 3 øþ ü ú 0ÿ ù ÷ ýù þ þ /"&( ( ) -& "" #""" 0%$ ÷ÿ ú ÷ÿ þ ÷ ýù þ þ ' 1( " ,&( ) - 1 , " " "4, " " " " " 1 øþ ü +ÿ ÷ú 56 7 ø !ú ú þ ' ( 1&( ) - 1 -"" ,""" ,%8 ù ü ú 0ÿ ù ÷ö ø !ú ú þ /"&( " 0&( ) - , "" *"" "% ù ùÿ ú 0ÿ ù ÷ö ø !ú ú þ /"&( " ,&( ) - * # " " " "9 " " " " " " 1 ÿ õ ú ü ø÷ ö ø !ú ú þ ' ,( "( ) - * " " ": " " " " " *; ÷ ú ú 2 ÷ ýù þ þ /"&( " 0&( ) - *" #"" 188 Selbstverständlich sind auch komplexere WHERE-Bedingungen oder Sortierungen möglich. 189 ***************** "Join mit komplexerer WHERE Bedingung" *** ; 190 TITLE1 ’Zusammenfassen zweier Tabellen’; RUN; 191 TITLE2 ’WHERE-Befehl, um die richtigen zuzuordnen und fuer’; 192 TITLE3 ’Personen mit Geld > 10000’; RUN; 193 PROC SQL; 194 SELECT dat2.id, dat2.Name, Vorname, 195 dat3.Geld, VSumme 196 FROM saskurs.dat2, saskurs.dat3 197 WHERE (dat2.id=dat3.id) AND (Geld > 10000); 198 QUIT; NOTE: The PROCEDURE SQL used 0.1 seconds. < = > ? @ @AB C? > > AB D EA F AGH? I A J J A B M&N O P O&Q R A CA S JT= @VUF AWG F X S Y F Z A B D= D= [G UB ABV= B UVC= AG \ AG > [ B AB]@ F YV^A J U`_aK b b b b c de ? @A f[G B ? @A ^A J UfAG >g h= @ @A i i i i i i i iL% i i i R i ?i G i [i B i i i i i i i i i i j i ?i G i F i ? i i i i i i i i i i i i ik ib ib ib ib ib i i i i i i i i ik ib ib ib K b%j [ A J J AG lB U&G A ?> Kbbbbbb mbbbb K nh YG = B D HS [ @? > obbbbb Kpbbb 199 KL 200 ***************** "Join" *********************************** ; 201 TITLE1 ’Zusammenfassen zweier Tabellen’; 202 TITLE2 ’WHERE-Befehl, um die richtigen zuzuordnen und fuer’; 203 TITLE3 ’Personen mit Gebdat zwischen 1960 und 1965’; 204 TITLE4 ’Neue Variable DIFF erzeugen und mit HAVING Teilmenge auswaehlen’; 205 TITLE5 ’Ausgaben sortiert nach DIFF absteigend’;RUN; 206 PROC SQL; 207 SELECT dat2.id, dat2.Name, Vorname, Gebdat, 208 Geld, VSumme, 209 (Geld-VSumme) AS Diff LABEL=’Differenz Geld-VSumme’ 210 FROM saskurs.dat2, saskurs.dat3 211 WHERE (dat2.id=dat3.id) AND ("01/JAN/1960"D < Gebdat < "31/DEC/1965"D) 212 HAVING (DIFF >= 20000) 213 ORDER BY DIFF DESCENDING; 214 QUIT; NOTE: The PROCEDURE SQL used 0.14 seconds. 215 qr s t u uvw xt s s vw y zv { v|}t ~ v v w & & v xv r uV{ vW| { { v w yr yr | w vwVr w Vxr v| v| s w vw]u { Vv ~ t `y z{s vw` ar w W vr v]t| { t ~ v` v| y vr v w`r w Vu { ` V}v { u vw vVtr s zt v v w r s t ~ vwVs | { v| aw t Vt ~ s v { v w { x xv| vw y t uv | w t uv v~ r| s t r u v v| s r u uv v r u u v % v v | w & | v t s 9 ¡ ¢% t| w t| { t £ £. 4.6 CREATE: Erzeugung neuer Tabellen 216 ********************************************************* ; 217 ************** Anlegen neuer Tabellen ******************* ; 218 TITLE1 ’Neue Tabelle mit der Variablen Differenz=Geld-VSumme’; RUN; 219 TITLE2 ’mit dem Befehl CREATE TABLE’;RUN; 220 PROC SQL; 221 CREATE TABLE saskurs.dat4 AS 222 SELECT id, Name, Vorname, Geschl, Geld, VSumme, 223 (Geld-VSumme) AS Diff LABEL=’Differenz Geld-VSumme’ 224 FROM saskurs.dat1; NOTE: Table SASKURS.DAT4 created, with 12 rows and 7 columns. 225 QUIT; NOTE: The PROCEDURE SQL used 0.17 seconds. 226 *** Ansicht der neuen Tabelle ***; 227 PROC SQL; 228 SELECT * FROM saskurs.dat4; 229 QUIT; NOTE: The PROCEDURE SQL used 0.07 seconds. ¤ ¥¦ ¥ §¨© ¥ ª ª ¥ «¬ ­V®¥¯°¨¯ ¬ ¨ © ª ¥ ± ² ¬ ³ ³¥¯ ¥ ± ´ µ ¶¥ ª ®· ° ¸¦ « «¥ «¬ ­V® ¥ «`» ¥ ³¥ ¼ ª ½¾ ¿ À§¿ § À»Á ¿ ¹º ² ¬ ³ ³¥¯ ¥± ´  ²¤ ¨ «¥ °Ã¯ ± ¨ «¥ ¶¥Ä ż ª ¥ Å ¼ ­ ¶¥ ª ®°¥¯ ÄÆ ¸¦ « «¥¶¥ ª ®· ° ¸¦ « « ¥ Ç Ç Ç Ç Ç Ç Ç Ç È3 Ç Ç Ç¸Ç Å Ç ¼ Ç«Ç ¬ Ç­Ç ´ Ç Ç Ç Ç Ç Ç Ç ÇÀÇ ± Ç®&Ç ¯ Ç ¥ Ç ¨ Ç Ç Ç Ç Ç Ç Ç Ç Ç Ç ÇÉÇ ¥ Ç ¬ Ç © Ç ª Ç ¬ Ç ÅÇ ¼ Ç Ç Ç Ç Ç Ç Ç ÇÊ Çº Ǻ Ǻ Ç Ç Ç Ç Ç Ç Ç Ç Ç Ç È Çº Ǻ Ç Ç Ç Ç Ç Ç Ç Ç Ç Ç¹ ÇË Çº Ǻ ¹¸Å ¼ «¬ ­´ ̯ ¨± Í· Î ­ ­ à « ϱ ± ª ¬ ż кºº Ѻº Êкº Ê%» ¨¯ ñ À&ª ³&¯ ¥ ® « ϱ ± ª ¬ ż Òººº ÈÓºº Êʺº Ð%Ô ¥ ­´ à ª ® À± ®&¯ ¥ ¨Ä « ϱ ± ª ¬ ż ÈÒºº Ⱥº Èкº Ò;Á ¨ ± Õ À± Ö ¨ É¥ ¬ © ª ¬ ż Èʺº Òº ȹҺ Ñ À± ®&¯ ¥ à ­ ­¬.× ¨¯ ¬ ¨ « ϱ ± ª ¬ ż ¹Ñºº ʺº ¹Êºº Ó¶¨ ¦ ®¬ À± Ö ¨ É¥ ¬ © ª ¬ ż Òʺº Óºº ÐѺº Ø%» ¨¯ ñ × ¨¯ ¬ ¨ É¥ ¬ © ª ¬ żÙÐ º º º º º кºº ÊËѺºº ˶¨ ¦ ®¬ ̯ ¬ ­´ « ϱ ± ª ¬ ż ʺºº ÐÒº ¹ÒÒº È º%× Ã ¥ ª ª ¥¯ À± ®&¯ ¥ ¨Ä « ϱ ± ª ¬ ż'È º º º º º º ʺººº ËÓ º º º º È È × Ã ¥ ª ª ¥¯ À± ®&¯ ¥ ¨Ä « ϱ ± ª ¬ ż Ⱥº Æ Æ È ¹¸ ­¯ ¦ ± ´ §¼ à «¨ Ä « ϱ ± ª ¬ żÚÓ º º º º º ÈÒººº ÑØÒººº 230 TITLE1 ’saskurs.dat4 normal als SAS-Datei verwendbar’; RUN; 231 TITLE2 ’Beispiel: PROC MEANS’; RUN; 232 PROC MEANS DATA=saskurs.dat4; 233 CLASS geschl; 234 VAR Diff; 235 RUN; 236 NOTE: The PROCEDURE MEANS used 0.1 seconds. Û ÜÛ Ý Þ ß Ûà áÜ â ãaä åß æ Ü çVÜ ç Û]è éèê ë Ü â ì í îìß ïìä áð Üß ó ì í Û ô í ì çõ÷ö ø ù ú`û ü é&ý è éä Ü ç þÛ íÛÿÜß í Üð ç ì õ÷ë ë í ìß ìä ì ç áê ÿ èÞ æ æì ü è ú ý ùð Û ý û ì Üä è â á`ë ì î û íä í æÞ æ û Ü í æÞ æ êêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêê ï&ì í ð ç í ã ã ò ò ò à ò ã àã ò ñ à à æ ä ä ç í Úñ ñ à Úã&ò à ã ò ã à à êêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêê ñ&ò 4.7 INSERT und SET: Einfügung neuer Beobachtungen 237 ************* Einfügen einer neuen Beobachtung ****************; 238 TITLE1 'Einfügen einer neuen Beobachtung';RUN; 239 TITLE2 'mit dem Befehl INSERT INTO';RUN; 240 PROC SQL; 241 INSERT INTO saskurs.dat4 242 SET id=13, 243 Name="Nobel", 244 Vorname="Alfred", 245 Geschl=2, 246 Geld=5.E8, 247 VSumme=., 248 Diff=.; NOTE: 1 row was inserted into SASKURS.DAT4. 249 QUIT; NOTE: The PROCEDURE SQL used 0.2 seconds. 250 *** Ansicht der neuen Tabelle ***; 251 PROC SQL; 252 SELECT * FROM saskurs.dat4; 253 QUIT; NOTE: The PROCEDURE SQL used 0.07 seconds. 254 ! " # $ % &' (! * (+ * " ' ,.- / 0 1 23- / 2 4 5 6 - 57/ % * 8# % * 9: &' , & ' ( 9 , +78 :<; 0! * * =9 , +<> 8 0! * * ? ? ? ? ? ? ? ? @A ? ? ?0? & ? ' ?* ? ?(? 6 ? ? ? ? ? ? ? ?BC? ?+D? ? ? % ? ? ? ? ? ? ? ? ? ? ?E? ? ? $ ? , ? ? &? ' ? ? ? ? ? ? ? ?F ?G ?G ?G ? ? ? ? ? ? ? ? ? ? @ ?G ?G ? ? ? ? ? ? ? ? ? ?) ?H ?G ?G )70& ' * (6 I % J> 4 ( ( # LGGG MGG FLGG * K , &' FN" % # BD, D + OGGG @PGG FFGG * K , &' LNQ (6 # , + BC +D %: @OGG @GG @LGG * K , &' OSR % BC T % E $ , &' @FGG OG @)OG MUBC +D # ( (V % % , & ' ) M G G F G G ) FGG *K P=9% ! + BC T % E $ , &' OFGG PGG LMGG WN" % # V % % E $ , &'XL G G G G G LGGG FHMGGG H79% ! + I (6 FGGG LOG )OOG * K , &' @ GNV # , , BC +D %: FGGGG HP G G G G * K , &'Y@ G G G G G G @ @UV # , , BC +D %: @GG ; ; * K , &' @ )70 ( ! 6 2' # * % : , & Z ' P G G G G G @ O G G G M W O G G G *K @ FN/ # $ , BD, D + ; ; * K , &'UO G G G G G G G G )) 4.8 UPDATE und SET: Änderung von Variablen oder einzelner Werte 255 ************* Ändern der Werte **************************; 256 TITLE1 'Umrechnung der Werte fuer Differenz in Euro'; 257 TITLE2 'mit dem Befehl UPDATE';RUN; 258 PROC SQL; 259 UPDATE saskurs.dat4 260 SET Diff = ROUND(Diff/1.95583 , 0.01); NOTE: Invalid arguments to the ROUND function have caused the function to return a missing value. NOTE: 13 rows were updated in SASKURS.DAT4. 261 QUIT; NOTE: The PROCEDURE SQL used 0.14 seconds. 262 *** Ansicht der neuen Tabelle ***; 263 PROC SQL; 264 SELECT id, Name, Vorname, Diff LABEL="Differenz Geld-VSumme in Euro" 265 FROM saskurs.dat4; 266 QUIT; NOTE: The PROCEDURE SQL used 0.05 seconds. 267 [ \D] ^ _ ` a b a cd ^]feD^] g ^hb ^]ji k h h^] ^ a lkamb ] n \k gd ^ \rq ^ h^ ` s[ t i uvm i k h h^] ^a l w^ s d<x yzb \ \ ^ { i7| } \^ yn] a } \^ k am b] n ~ ~ ~ ~ ~ ~ ~ ~ A ~ ~ ~z~ _ ~ ` ~\~ k ~g~ l ~ ~ ~ ~ ~ ~ ~ ~uC~ a ~dD~ ] ~ ^ ~ } ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~o~ ~ ~ o7z_ ` \k gl ] }a x g g n p p pNq }] na uDs hD] ^ d < o Nt ^ gl n s d uCa dD] ^ } S } a c uCa } p UuCa dD] ^ n g gk }] k } =w} b dk uCa } o p DD Nq }] na }] k } o o C 7w} b dk ] k gl p p N n ^ s s ^] uCa dD] ^ } p U n ^ s s ^] uCa dD] ^ } o7z g] b a l v` n \} p o p pN| n ^ s uDs hD] ^ d op 268 ************* Ändern der Werte **************************; 269 TITLE2 'Aenderung einzelner Werte mit dem Befehl UPDATE';RUN; 270 PROC SQL; 271 UPDATE saskurs.dat4 272 SET Geld = 10000000, Name="Prof. Nobel" 273 WHERE ( Name="Nobel" and Vorname="Alfred" ); NOTE: 1 row was updated in SASKURS.DAT4. 274 QUIT; NOTE: The PROCEDURE SQL used 0.14 seconds. 275 *** Ansicht der neuen Tabelle ***; 276 PROC SQL; 277 SELECT id, Name, Vorname, Geld 278 FROM saskurs.dat4; 279 QUIT; NOTE: The PROCEDURE SQL used 0.05 seconds. 280 ¡ ¤D ¥ ¦ § f¨D ¡ © ¡¥ ©r §ª « ¬ ¤­ ® ¬7¯ © ° © ± § ¥ ² ² ² ² ² ² ² ² ³A ² ² ²´² ² ²©² ²¡² ¦ ² ² ² ² ² ² ² ²¤C² ²¥D² ² ² ² ² ² ² ² ² ² ² ² ² ² ² ² ²µ ²¶ ²¶ ²¶ ¢7´ © ¡¦ · ¸¹ º ¡ ¡ £¶¶¶ µN ¤D§ D ¥ »¶¶¶ £N« ¡¦ § ¥ ¤C ¥D ¼ ³»¶¶ »S½ ¤C ¾ ³µ¶¶ ¿U¤C ¥D ¡ ¡À ¢¿¶¶ Á=± ¥ ¤C ¾ »µ¶¶ ÂN À £¶¶¶¶¶ Ã7± ¥ · ¡¦ µ¶¶¶ ³ ¶NÀ § § ¤C ¥D ¼ ³¶¶¶¶¶¶ ³ ³UÀ § § ¤C ¥D ¼ ³¶¶ ³ ¢7´ ¡ ¦ ­ © ¼ Á¶¶¶¶¶ ³ µN« Äů §Æ¤D§ D ¥ ³¶¶¶¶¶¶¶ ¢£ 4.9 ALTER und ADD: Einfügen neuer Variablen 281 *************** Einfügen neuer Variablen ****************; 282 TITLE1 'Einfügen neuer Variablen in bestehenden Datensatz';RUN; 283 TITLE2 'mit dem Befehl ALTER TABLE';RUN; 284 TITLE3 'Zuweisen von Werten ist mit UPDATE und INSERT möglich';RUN; 285 PROC SQL; 286 ALTER TABLE saskurs.dat4 287 ADD Schaden NUM LABEL="Schaden" FORMAT=schadf., 288 Notiz CHAR(6) LABEL="Notiz", 289 Datum DATE LABEL="Falldatum" FORMAT=DDMMYY10.; NOTE: Table SASKURS.DAT4 has been modified, with 10 columns. 290 * Zuweisen von Werten mit UPDATE oder INSERT; 291 * hier erfolgt die Zuweisung mit INSERT INTO; 292 INSERT INTO saskurs.dat4 293 SET id=14, 294 Name="Sauer", 295 Vorname="Brigitte", 296 Geld=., 297 Vsumme=500, 298 Schaden=1, 299 Notiz="Unfall", 300 Datum="01MAY1999"D; NOTE: 1 row was inserted into SASKURS.DAT4. 301 QUIT; NOTE: The PROCEDURE SQL used 0.36 seconds. 302 TITLE1 'Den geänderten Datensatz dat4 mit den neuen Variablen'; 303 TITLE2 'und einer zusätzlichen Beobachtung anzeigen';RUN; 304 TITLE1 'Der geänderte Datensatz dat4 mit den neuen Variablen'; 305 TITLE2 'und einer zusätzlichen Beobachtung anzeigen';RUN; 306 PROC SQL; 307 SELECT id, Name, Vorname, Vsumme, Schaden, Notiz, Datum 308 FROM saskurs.dat4; 309 QUIT; NOTE: The PROCEDURE SQL used 0.05 seconds. Ç ÈÉÊ È ËÉ ÌÈÍ Î ÈÉÇ Ï ÎÈ É Ð Ï ÎÑÌ Ï Î ÒÓ Ô ÎÌÈ ÉÉ ÈÕ ÈÉ×ÖÏÍ Ô ÏØ Ù È É Õ É ÌrÈ ÔÉ ÈÍjÑÕ Ð Ë Î Ñ Ù Ô Ü Ý ÈÉÞ È ß Ø Ï Ü Ý ÎÕ É ÊrÏ É Ñ È Ô Ê ÈÉ à Ç7á Ï ÓÈ ÖßÍ É Ï ÓÈ ÖÈÍ Ð<â ãÕ Ó ÓÈ=ãÜ Ý Ï Ì ÈÉ=á ß Î Ô Ñ ä Ï Ù Ù ÌÏ ÎÕ Ó å å å å å å å å æA å å åãå Ü å Ý åÓå Ô åÎå Ñ å å å å å å å åçCå É åÌDå Í å È å Ï å å å å å å å å å å å å å å å å æ åè åèê å å å å å å é<å â åçëå â å å å å å å å å å å å å å å å å å å å å å å â Ú7ãÜ Ý ÓÔ ÎÑ äÍ ÏÉ éì í Î Î ß î è èêé<â çëâ â ïNÞ ÏÍ ßÉ çDÙ ðDÍ È Ì æ ñ è èêé<â çëâ â ÒNò È ÎÑ ß Ù Ì çCÉ ÌDÍ È ÏÐ æ è èêé<â çëâ â ÛSó Ï É Ê çCÉ ô Ï Û èêé<â çëâ â îUçCÉ ÌDÍ È ß Î ÎÔõ ÏÍ Ô Ï ï è èêé<â çëâ â ñ=öÏ Õ ÌÔ çCÉ ô Ï ñ è èêé<â çëâ â ÷NÞ ÏÍ ßÉ õ ÏÍ Ô Ï Ò è è èêé<â çëâ â ø7öÏ Õ ÌÔ äÍ Ô ÎÑ Ò Û èêé<â çëâ â æ èNõ ß È Ù Ù ÈÍ çCÉ ÌDÍ È ÏÐ ï è è è èêé<â çëâ â æ æUõ ß È Ù Ù ÈÍ çCÉ ÌDÍ È ÏÐ âùé<â çëâ â æ Ú7ã ÎÍ Õ É Ñ úÝ ß ÓÏ Ð æ Û è è èêé<â çëâ â æ ïNòÍ ß ðâÅá ßØ È ÙÆçDÙ ðDÍ È Ì âùé<â çëâ â æ Ò7ãÏ Õ ÈÍ ÞÍ Ô Ê Ô Î Î È Û è èûô ÏýüÉ ð Ï Ù ÙýèDæ þ è ÛCþ æ ø ø ø ÚÛ 4.10 PROC SQL Pass-Through Facility Die PROC SQL Pass-Through Facility ermöglicht es, direkt auf Daten aus Datenbanken wie z.B. AS/400, DB2, DB2/2, DB2 for UNIX DEC Rdb, Informix, INGRES, ODBC, ORACLE, SQL/DS, sowie SYBASE und SQL Server zuzugreifen. Um die PROC SQL Pass-Through Facility verwenden zu können, ist eine Lizensierung der entsprechenden SAS/ACCESS Software für das verwendete data base management system (DBMS) notwendig. Die SAS-Syntax hat die folgende Struktur. PROC SQL; CONNECT TO dbms (dbms_options); SELECT * FROM CONNECTION TO dbms ( database-specific SQL statements ); EXECUTE ( database-specific non-SELECT statement ) BY dbms; DISCONNECT FROM dbms; Im folgenden werden drei Methoden zur Berechnung von statistischen Kenngrößen gegenüber gestellt. Hierbei wird dBASE als Beispiel verwendet, da viele Programme für PCs Dateien im dBase-Format abspeichern können, z.B. Microsoft Excel. 1. Daten stehen in einer SAS-Datei 2. Daten stehen in einer dBASE-Datei, Kopieren der Daten mit SAS/ACCESS nach SAS und dann Auswertung in SAS 3. Daten stehen in einer dBASE-Datei, Auswertung mit der PROC SQL Pass-Through Facility, ohne die Daten in eine SAS-Datei abzuspeichern. Die PROC SQL Pass-Through Facility hat den Vorteil,. daß bei großen Datensätzen die Daten nur einmal gehalten werden müssen, was zu einem geringeren Speicherbedarf und evtl. zu schnelleren Antwortzeiten führen kann. Demgegenüber ist als Nachteil zu nennen, daß die PROC SQL Pass-Through Facility mehrfach verwendet werden muß, wenn mehrere Auswertungen für diese Daten aus ein und derselben externen Datei gewünscht werden. Außerdem sind so komplexere Fragestellungen (komplexere StatistikProzeduren) nicht durchführbar. 4.10.1 Daten stehen in einer SAS-Datei 310 ******** Vergleich: Daten-Import versus PROC SQL PASS-THROUGH FACILITY ******; 311 TITLE1 "PROC MEANS: Summe und Mittelwert fuer Vsumme berechnen aus SAS-DATEI"; 312 TITLE2 "für Geschlecht=2 und Geld >= 3000"; 313 RUN; 314 PROC MEANS DATA=saskurs.dat1 N SUM MEAN; 315 WHERE ( Geschl=2 AND Geld >= 3000 ); 316 VAR Vsumme; 317 RUN; 318 NOTE: The PROCEDURE MEANS used 0.05 seconds. ÿ ! #" $ &% ' ( ) ,.- ! ! / * - 0 /#1 2 2 2 & " 3 ." " 4 5 6 $ &7 " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 8 9: : 8 2;7 2 2 < 8 8 2;7 2 2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% *+ 4.10.2 Verwendung von SAS/ACCESS 319 ********************************************************************; 320 TITLE1 "Methode 2: Zunaechst dBASE-Daten in SAS-Datei kopieren, dann Auswertung in SAS"; 321 TITLE2 "PROC MEANS: Summe und Mittelwert fuer Vsumme berechnen aus SAS-DATEI"; 322 TITLE3 "für Geschlecht=2 und Geld >= 3000"; 323 RUN; 324 /* Erzeuge access descriptor */ 325 PROC ACCESS DBMS=DBF 326 ACCDESC = saskurs.access 327 FUNCTION = C; NOTE: CREATE statement required to replace ACCESS.ACCESS. 328 CREATE saskurs.access.ACCESS; NOTE: Existing descriptor will be replaced at next CREATE or RUN. 329 PATH = "d:\saskurs\dat1.DBF"; 329 /* dBASE-file */ 330 DROP 1; 330 /* DROP DELETE_FLG */ 331 FORMAT Gebdat ddmmyy10.; 331 /* sonst: ddmmyy8. */ 332 LIST ALL; DBF File: d:\saskurs\dat1.DBF Function: CREATE Descriptors- access: ACCESS view: Item Column Name SAS Name Format 1 DELETE_FLG $1. * NON DISPLAY * 2 ID 12.4 3 NAME $12. 4 VORNAME $12. 5 GESCHL 12.0 6 GEBDAT DDMMYY10. 7 GELD 9.0 8 VSUMME 12.0 333 RUN; NOTE: The access descriptor SASKURS.ACCESS was written. NOTE: The PROCEDURE ACCESS used 0.44 seconds. 334 /* Erzeuge view descriptor */ 335 PROC ACCESS DBMS=DBF 336 ACCDESC = saskurs.access; 337 CREATE saskurs.view.VIEW; 338 SELECT ALL; 339 UNIQUE = YES; NOTE: UNIQUE names is now ON. 340 LIST VIEW; DBF File: d:\saskurs\dat1.DBF Function: CREATE Descriptors- access: ACCESS view: VIEW Item Column Name SAS Name Format 2 ID ID 12.4 * SELECTED * 3 NAME NAME $12. * SELECTED * 4 VORNAME VORNAME $12. * SELECTED * 5 GESCHL GESCHL 12.0 * SELECTED * 6 GEBDAT GEBDAT DDMMYY10. * SELECTED * 7 GELD GELD 9.0 * SELECTED * 8 VSUMME VSUMME 12.0 * SELECTED * 341 RUN; NOTE: The view descriptor SASKURS.VIEW was written. NOTE: The PROCEDURE ACCESS used 0.28 seconds. 342 PROC ACCESS /* Erzeuge SAS-Datei */ 343 VIEWDESC = saskurs.view /* Angabe view descriptor */ 344 OUT = saskurs.dat1neu; 344 /* Angabe SAS-Datei */ 345 RUN; NOTE: The data set SASKURS.DAT1NEU has 12 observations and 7 variables. NOTE: The PROCEDURE ACCESS used 0.15 seconds. 346 /* CHECK, OB DATEN-TRANSFER KORREKT DURCHGEFUEHRT WURDE */ 347 /* 348 PROC CONTENTS DATA = saskurs.dat1neu; 349 RUN; 350 PROC PRINT DATA = saskurs.dat1neu LABEL; 351 RUN; 352 */ 353 PROC MEANS DATA=saskurs.dat1neu N SUM MEAN; 354 WHERE ( Geschl=2 AND Geld >= 3000 ); 355 VAR VSumme; 356 RUN; 357 NOTE: The PROCEDURE MEANS used 0.05 seconds. = > ?@ A B>#C;DEF G H > I @ J ?B K LMNO P H ?> G#QG$M LMRO P H ? > QS A T Q >U >GRVB HG G.LF J W>U ?F G XQ G#M LM Z [ \ ]= N L^ MDMF _ _>F G B= Q ? ? > ` W>U ?aF >UbJ F _ _ >c >U > I @ G >G#HF J$M LM&O P Ld Ne afU.g >J I @ ` > I @ ?h CF G Bg > ` Bi h#j k k k L&G H ` lJ QJ.bHU Q Hc ` >4D5bM m = = N$bM m = = N ^ MF _ =>HG OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO n oY Y n k;p k k q n n k;p k k OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO 4.10.3Verwendung der PROC SQL Pass-Through Facility 358 ********************************************************************; 359 TITLE1 "Methode 3: PROC SQL Pass-Through Facility"; 360 TITLE2 "Mit PROC SQL direkt die Daten aus der dBASE-Datei auswerten"; 361 TITLE3 "PROC MEANS: Summe und Mittelwert fuer Vsumme berechnen"; 362 TITLE4 "für Geschlecht=2 und Geld >= 3000"; 363 RUN; 364 PROC SQL; 365 CONNECT TO ODBC ( "DSN=dBase-Dateien;DBQ=d:\saskurs;FIL=dBase4;"); 366 SELECT 367 COUNT(Vsumme) AS Anzahl LABEL="Anzahl VSumme" , 368 SUM(Vsumme) AS Summe LABEL="Summe Vsumme" , 369 MEAN(Vsumme) AS Mittel LABEL="Mittelwert Vsumme" FORMAT=6.1 370 FROM CONNECTION TO ODBC ( SELECT Geschl, Geld, Vsumme 371 FROM dat1 ) 372 WHERE ( Geschl=2 AND Geld >= 3000 ); 373 ; 374 QUIT; NOTE: The PROCEDURE SQL used 0.27 seconds. CY r s tu v ws#x;y{z | } ~ #z u v u t r tz | } ~ $w s tw s ts# $ws$ s ts s t s z | } ~r y s wr t t s s t s s s s u s . s u s u t w s w #x ¡ u ¢ s£r t t s s t s¤ s s ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥¦¨ ¥ ¥ ¥ ¥ ¥ ¥§¥ © ¥ © ¥¦ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ª ¥¦ ¥¦ ¥ ;¥ « ¥ Man beachte, daß für diesen kleinen Beispieldatensatz die folgenden Rechenzeiten auftraten: SAS/ACCESS mit PROC MEANS: 0.92 Sekunden, PROC SQL Pass Through Facility: 0.27 Sekunden. 5. Literatur 1. SAS Institute Inc., Getting Started with the SQL Procedure,Version 6, First Edition, Cary, NC: SAS Institute Inc., 1994, 78 pp. 2. SAS Institute Inc., SAS Guide to the SQL Procedure: Usage and Reference, Version 6, First Edition, Cary, NC: SAS Institute Inc., 1989, 210 pp. 3. SAS Institute Inc., SAS/ACCESS Software Changes and Enhancements: SQL Procedure PassThrough Facility, Version 6, Cary, NC: SAS Institute Inc., 1994, 44 pp. In SAS Version 6.12 für Windows sind im HELP-Menü unter SAMPLE PROGRAMS unter dem Eintrag SQL zahlreiche Beispielprogramme verfügbar. Zudem sind mit HELP PROC SQL viele Informationen online verfügbar. Schließlich sind im HELP-Menü unter → Online Documentation → Base SAS Documentation → SQL Prodecure → PROC SQL Code Reference → SQL Query Window weitere Informationen online verfügbar. Zum Schluß sei noch darauf hingewiesen, daß mittels → Globals → ACCESS → Query bzw. mit → Globals → Present → Create Report viele einfache Tabellen und Reports, sogar mit Farbdefinition, per Mausclick erstellt werden können.