Funktion: Tabelleninhalte nacheinander durch eine Funktion schicken

Ähnliche Dokumente
zusammenfassen von Text variablenin einer Variable bei unterschiedlicher Variablenanzahl

News Artikel Foren Projekte Links Über Redscope

Umbenennung von Spaltennamen über Schleife(n)

Zeilen in SAS-Datensatz einfügen

Hallo Jessi, wenn ich das. DATA aufg3_b; vari='<.0001'; IF &wil_two_test. le vari THEN pwert=0.0001;

Eine Variable in mehrere aufteilen

Import von Text-Dateien. Einzelne Wörter einlesen.

Spalten aufsummieren?!

Merge mit nicht eindeutigen by-variablen

Ansprechen einer Anzahl von Variablen über einen Schleifendurchlauf

Berechnung der Dauer eines SAS Makros?

SUBSTRING - wo liegt mein Fehler?

QMF Tabelle Q.OBJECT_DATA in DB2

Dynamisch Makros aufrufen

SAS-Tipp #6: Schneller als Proc Summary

Zeichen abscheiden???

Der SAS DataStep und die Prozedur SQL Cellent Finance Solutions GmbH Seite: 1

Alter berechnen mit Base SAS

NICHT TRIVIAL: MAKROVARIABLEN - GLOBAL ODER LOKAL

Vollständigen Code. News Artikel Foren Projekte Links Über Redscope. Join List Random Previous Next

Daten aus SPSS-18 Proc Format...

Jede Kombination von 7 Spalten erzeugen

IMPORT / EXPORT Access

Dateien trennen und zusammenfügen

Ermittlung der übereinstimmenden Variablen (-Namen) zweier Datasets

Mehrere Datensätze zu einem Datensatz zusammenführen

Zeit-Macro-Variablen, passend zu einem Tag

Änderung der Ordnung der Variablen in den SAS Datensatz

Macro erzeugt Dateifilter

ODS RTF Titel in Spalten linksbündig darstellen

Erzeugung von Zufallszahlen mit RANUNI()

rechtsbündige Leerzeichen mit einlesen im Datastep

Berechnung der Arbeitstage

Makrofunktion zur Übernahme von Abfragekriterien aus externen Quellen, z.b. einer Excel Datei, in SAS Code (PROC SQL)

Auslesen von SAS Systeminformationen über die aktuelle Log- Ausgabe

SAS BASE LOG Fragen. Antwort, Teil 1

Anhang zur Frage Data statement und Proc Statement

EG 4.2: Pfade zu verlinkten SAS-Files als relative Pfade speichern!?

Wie kann ich die Ausgabe als Excel speichern?

Wie überprüfen, ob eine Datei existiert?

News Artikel Foren Projekte Links Über Redscope

Datenbank und Tabelle mit SQL erstellen

SPDS-Problem - proc summary auf View mit by-variable - Sortierung wird verlangt

Einlesen von Textdateien mit sehr langen Zeilen

viele ähnliche Datensätze automatisch einlesen

Fehlermeldung, wenn Anzahl der %do der %end entspricht - was läuft falsch?

Exportieren in excel sheets

Hilfe bei Programmierung mit SAS

Datensatz aus Datensatz erzeugen

Allman-Einrückungsstil versus 1TBS bei SAS-Base-Programmen

Unix-Grundkurs 1. Thema heute: Shell-Skripten

SAS Implementierungs- Erfahrungen beim Aufbau eines zentralen Kunden Data Marts für Data Mining

Formatierung beim Einlesen

B Synopsis der Programmiersprachen ABAP, VB und Java

Übersicht der wichtigsten MySQL-Befehle

Übung PL/SQL Trigger Lösungen

Datenbanken SQL Einführung Datenbank in MySQL einrichten mit PhpMyAdmin

Listensyntax und PutPutPut Mach es! Jetzt! Lokal!

3 Query Language (QL) Einfachste Abfrage Ordnen Gruppieren... 7

MySQL-Befehle. In diesem Tutorial möchte ich eine kurze Übersicht der wichtigsten Befehle von MySQL geben.

Kreuztabelle als Data-Set so wie aus proc tabulate

Oracle 9i Einführung Performance Tuning

Es geht also im die SQL Data Manipulation Language.

spezielle Summen bilden und proc corr

Funktionen. Überblick über Stored Functions. Syntax zum Schreiben einer Funktion. Schreiben einer Funktion

SAS Daten per Remote SUBMITE vom Großrechner selektieren,

SAS Macro Quoting. Tim Lepp Bayer AG Müllerstr Berlin

THEMA: SAS STORED PROCESSES ALS WEB-/REST-SERVICE AUFRUFEN" BRUNO MÜLLER

Excel sheet input / Zufallsgenerator/ Excel sheet output

Übersicht Shell-Scripten

Zugriff aus Oracle via Proc SQL: Performanceprobleme

SQL-Sprachvielfalt. Peter Willadt (Ludwig-Erhard-Schule) SQL-Befehle / 47

THEMA: SAS CERTIFIED BASE PROGRAMMER FOR SAS 9 DIE VORBEREITUNG BRINGT S! KARIN GROSS

Informatik II, SS 2014

SAS Format: Fallen und Tricks

Programminhalte extrahieren und modifizieren mit SAS. Katja Glaß

PROC GCHART HBAR Zeilenumbruch in Achsenbeschriftung

Möglichkeiten der SAS Software für die Analyse großer Datentabellen

THEMA: PLAUSIBILITÄTSPRÜFUNGEN MIT INTEGRITY CONSTRAINTS IN BASE SAS KARIN GROSS

Grundlagen von SQL. Informatik 2, FS18. Dr. Hermann Lehner (Material von Dr. Markus Dahinden) Departement Informatik, ETH Zürich

5/14/18. Grundlagen von SQL. Grundlagen von SQL. Google, Facebook und Co. setzen auf SQL. Whatsapp

PHP MySQL - myphpadmin Formulardaten in eine Datenbank speichern

Frage zu Markoschleife und PROC SQL

Eigene Funktionen innerhalb von pgsql

SQL. Automatisierung: Trigger

05 For-Schleifen. For-Schleifen 1/7 Was ist eine Schleife?

Vorbemerkung. Allgemeines zu Shell Scripts. Aufruf. Einfaches Beispiel

SASGraphs2PDF. Erstellung einer PDF Datei aus SAS Graphiken mit Hilfe von ODS PDF. Monika Kawohl, Dirk Spruck Aventis Behring GmbH Biometrie

Programming 101. Carl Herrmann IPMB & DKFZ

Perl Regular Expressions in Base SAS

Fragen zu Table of Content erstellung

Möglichkeiten der Nach-Verfolgung von Änderungen an SAS-Datensätzen

Tipps & Tricks: Umkodieren von ICD-9-Daten Daten zu ICD-10 in SAS mittels PROC SQL

Aufbau eines dynamischen ETL Frameworks auf Basis eines PL/SQL Codegenerators

Arrays. Arrays werden verwendet, wenn viele Variablen benötigt werden. Der Vorteil in Arrays liegt darin, dass man nur eine Variable deklarieren muss

1 Equi Join und Inner Join

Funktionen in JavaScript

Transkript:

News Artikel Foren Projekte Links Über Redscope Join List Random Previous Next Startseite Foren Allgemeine Fragen zu SAS Funktion: Tabelleninhalte nacheinander durch eine Funktion schicken 20 September, 2012-13:33 reeng Hallo zusammen Ich habe eine Tabelle "Tbw_Test", in der ich folgende unique Keys gespeichert habe: 123-456-789 987-654-321 456-789-321 456-321-789 Weiter habe ich ein Programm geschribene, welches sich aus mehreren data daten1; data daten2; set daten1; data daten3; set daten2; proc summary sum data = daten3; output = Ergebnis sum=; iterativ zusammensetzt. Nun möchte ich gerne, dass dieses Programm mit jeder der vier oben genannten unique Nummern nacheinander durchgeführt wird und mir schussendlich eine neue Tabelle mit 4 Ergebnisse (vom Proc summary Teil) generiert. Ist dies überhaupt möglich? Ich arbeite zusätzlich mit GNU R. Dort würde ich dies mit einer For-Schleife und einer Funktion realisieren. Die Unique Keys würde ich so mit einer For-Schleife in die Funktion schicken. Die Funktion würde dann diese data..; steps beinhalten und das Ergebnis mit return(ergebnis) zurückschicken. Vielen Dank im Voraus für eure Hilfe. Liebe Grüsse aus der Schweiz Reeng Foren: Allgemeine Fragen zu SAS

Hallo Reeng, ich hoffe ich Hallo Reeng, ich hoffe ich habe das Problem richtig verstanden. Meine Lösung sähe so aus: 20 September, 2012-14:55 Frederik_Bloch data testdaten; input key $20.; datalines; 123-456-789 987-654-321 456-789-321 456-321-789 ; %macro test; /** Wenn es schon eine Ergebnistabelle gibt, dann löschen **/ %if %sysfunc(exist(ergebnis)) %then %do; proc datasets lib=work nolist; delete Ergebnis; %end; /** Unique Keys in eine Macrovariable schreiben **/ proc sql noprint; select trim(key), count(key) into :keys separated by ' ', :anz from testdaten; /** Mit Schleife durch die Keys iterieren **/ %do n=1 %to &anz; %let akt_key = %scan(&keys, &n, %str( )); %put &akt_key; data daten1; data daten2; set daten1; data daten3; set daten2;

proc summary sum data = daten3; output=ergebnis_temp sum=; /** Anhängen der Summary-Tabelle an die Ergebnistabelle **/ PROC APPEND BASE=Ergebnis DATA=Ergebnis_temp FORCE; /** Aufräumen **/ proc datasets lib=work nolist; delete daten1 daten2 daten3 Ergebnis_temp; %end; %mend; %test; Ich wusste natürlich nicht, wo du den Key in deiner Verarbeitung einfließen lassen willst. Ich schätze mal, du schränkst im ersten Datastep irgendwie auf den Key ein oder so? Ich habe es einfach mal rausgelassen. Jedenfalls hast du in jeder Iteration den aktuellen Key in der Macrovariablen &akt_key zur Verfügung. Gruß Frederik Hi Frederik Besten Dank für Hi Frederik 20 September, 2012-16:22 reeng Besten Dank für deine schnelle Antwort. Sieht ziemlich kompliziert aus. Ich habe meine "data..;" steps nun dein Code eingebaut. Das Programm wurde 4 mal durchlaufen, allerdings haben meine Tabellen keinen Inhalt und ich erhalte folgende Fehlermeldung: 785847-ASWS-8Y9C9L ERROR: Syntax error while parsing WHERE clause. Die Zeichnfolge 785847-ASWS-8Y9C9L entspricht dem oben genannten Key. Stimmt,die Key Variable möchte ich im ersten Data Step benutzen:

data daten1; set where key = "298231-ASWS-8Y9E7N"; /*Hier sollten eben die verschiede data daten2; set daten1; data daten3; set daten2; proc summary sum data = daten3; output = Ergebnis sum=; Ich habe versucht den Fehler einzugrenzen und bin dabei auf folgendes gekommen: - Anscheinend funktioniert die Übergabe aus der Testtabelle zur Schleife nicht ==> where key = &akt_key; gibt mir den oben genannten Fehler (ich denke wegen den Anführungszeichen). - Wenn ich anstatt where key = &akt_key; den statischen Wert where key = "298231-ASWS- 8Y9E7N" verwende, funktioniert das Makro bzw. ich erhalte keine Fehlermeldung und bekomme meine Ergebnis Tabelle (natürlich mit 4 mal dem gleichen Inhalt) - In meiner Tabelle Testdaten sind die Keys nicht mit Gänsefüschen aufgelistet. Vielen Dank für deine Unterstützung. Grüessli, René Hallo René, du musst den Wert Hallo René, du musst den Wert in der Macrovariable so übergeben: where key = "&akt_key"; 20 September, 2012-16:28 Frederik_Bloch Dann sollte es laufen. SAS erkennt nicht, dass in der Macrovariablen ein String ist und quotiert ihn automatisch, sondern führt eine simple Text-Substitution aus. Nachdem die Variable aufgelöst wurde, steht bei dir im Moment: where key = 298231-ASWS-8Y9E7N; Das kapiert SAS natürlich nicht. Gruß Frederik Hi Frederik Du bist genial, Hi Frederik 20 September, 2012-17:27 reeng

Du bist genial, es funktioniert :). Vielen, vielen Dank. Beste Grüsse aus der Schweiz. René Hallo FrederikDer Report Hallo Frederik 26 September, 2012-14:16 reeng Der Report läuft einwandfrei, viele Dank nochmals. Nun folgen schon die nächsten Wünsche :). Und zwar möchte ich gerne eine zweite Schleife einbauen, welche bei einer zweiten Tabelle "TB_Datum" alle records nacheinander durch das Programm schläust. Die Tabelle hat folgenden Inhalt: 17SEP2012 18SEP2012 19SEP2012 20SEP2012 21SEP2012 Zuerst soll das Makro das Datum 17SEP2012 nehmen und dann alle KEYs (erste Schleife n= 1 &to %anz) nacheinander durch das Programm schicken und in die Ergebnis Tabelle eintragen. Danach soll das Selbe mit dem Datum 18SEP2012 geschehen usw Die Resultate können alle in die selbe Ergebnis Tabelle eingefügt werden. Die Ergebnis Tabelle würde dann in etwa wie folgt aussehen: Datum Key Ergebnis_Temp 17SEP2012 123-456-789 10 17SEP2012 789-456-123 12 17SEP2012 456-789-123 15 17SEP2012 123-789-456 11 18SEP2012 123-456-789 09 18SEP2012 789-456-123 14 18SEP2012 456-789-123 12 18SEP2012 123-789-456 15 19SEP2012 123-456-789 07 19SEP2012 789-456-123 11 19SEP2012 456-789-123 15 19SEP2012 123-789-456 13 20SEP2012 123-456-789 05 20SEP2012 789-456-123 11 20SEP2012 456-789-123 09 21SEP2012 123-789-456 11 21SEP2012 123-456-789 12 21SEP2012 789-456-123 12 21SEP2012 456-789-123 11 21SEP2012 123-789-456 15 Ich habe bereits krampfhaft versucht, dein Code auszubauen:

proc sql noprint; select trim(autodealkey), count(autodealkey) into :keys separated by ' ', :anz from testdaten; proc sql noprint; select trim(datum), count(datum) into :keys2 separated by ' ', :anz2 from appsdates; /** Mit Schleife durch die Daten (Datums) iterieren **/ %do i=1 %to &anz2; %let akt_date = %scan(&keys2, &i, %str( )); %put &akt_date; /** Mit Schleife durch die Keys iterieren **/ %do n=1 %to &anz; %let akt_key = %scan(&keys, &n, %str( )); %put &akt_key;. Allerdings scheint der Befehl trim(datum) folgender Fehler zu verursachen: "ERROR: Function TRIM requires a character expression as argument 1" Kann ich kein Datum in der Trim() Funktion verwenden? Der Variable Datum habe ich das Format "format Datum date9.;" zugewiesen. Vielen Dank im Vorraus und liebe Grüsse aus der Schweiz René Hallo René, das sieht für 26 September, 2012-15:01 Frederik_Bloch Hallo René, das sieht für mich jetzt gerade nach einem Kartesischen Produkt (alles mit allem joinen) aus. Da würde ich gar keine Schleife machen sondern nur einen SQL-Join ohne Schlüssel-Verknüpfung. Hier ein Beispiel: data testdaten; input key $20.; datalines; 123-456-789 987-654-321 456-789-321 456-321-789 ;

data datumse; format datum date.; datum='17sep2012'd;output; datum='18sep2012'd;output; datum='19sep2012'd;output; datum='20sep2012'd;output; datum='21sep2012'd;output; proc sql noprint; create table ausg as select * from testdaten, datumse; Hilft das? Gruß Frederik Hallo Frederik Vielen Dank Hallo Frederik 26 September, 2012-16:49 reeng Vielen Dank für deine rasche Antwort. Nein, ich benötige diese beiden Schleifen, da das Programm nur für einen Key programmiert wurde ==> Ich muss jeden Key separat durch das Programm (Funktion)schicken. Allerdings habe ich das Problem in der Zwischenzeit gelöst :). Ich habe einfach die Trim() Funktion weggelassen und nur die Variable Datum stehen lassen: proc sql noprint; select Datum, count(datum) into :keys2 separated by ' ', :anz2 from appsdates; Für was braucht es die Trim() Funktion bei den Keys? Danke und Grüessli René Hallo René, das ist so ne 26 September, 2012-17:12 Frederik_Bloch Hallo René, das ist so ne Angewohnheit von mir ;) Damit schnippel ich die nachfolgenden Leerzeichen ab, bevor ich die Keys in

die Macrovariable schreibe. In diesem Kontext wirkt es sich aber nicht aus. Gruß Frederik Hallo Frederik Ich bin nun Hallo Frederik 27 September, 2012-16:47 reeng Ich bin nun dabei, die dritte und letzte Schleife einzubauen:). Diese dritte Schleife schickt verschiedene Namen von der Tabelle availsabes in das Programm: Peter Muster Petra Musterli Peter Musterli Perer Muster Nun bekomme ich jedoch bei folgender SQL Scan Funktion die Fehlermeldung: proc sql noprint; select SACHBEARBEITER, count(sachbearbeiter) into :keys3 separated by ' ', :anz3 from availsabe; %do k=1 %to &anz3; %let akt_sabe = %scan(&keys3, &k, %str( )); %put &akt_sabe; ==> ERROR: Macro function %SCAN has too few arguments. Könnte dies damit zusammenhängen, dass die Tabelle availsabe (&keys3) Einträge mit Leerzeichen beinhaltet? Wenn ja, wie kann ich das Problem umgehen? Vielen Dank im Vorraus Beste Grüsse aus der Schweiz René Hallo Frederik Konntest du Hallo Frederik 2 October, 2012-13:50 reeng Konntest du meinen letzten Beitrag bereits lesen? Ich wäre super froh um eine Antwort. Beste Grüsse, René

Text maskieren? lokale Variablen? Hallo reeng, 2 October, 2012-17:39 JanHeuer dein Problem ist mit den Angaben nicht genau genug beschrieben. Gib dir doch mal den Inhalt der Variablen %keys3. und &anz3. in das Log aus. Außerdem ist die Umgebung, in der der Macrocode ausgeführt wird, auch wichtig. Um zu vermeiden, dass deine Variablen in anderen Macros verändert werden, solltest du alle Variablen als local deklarieren. Besonders eine Zählvariable wie &k. ist dafür anfällig, in einer äußeren Schleife, oder in einem anderen Macro, verändert zu werden. Die Anzahl der Datensätze brauchst du im Sql nicht ermitteln. Der Wert steht in der SQL-Variablen &SQLObs. direkt nach der Ausführung des SQL-Statements; Um zu vermeiden, dass dein Trenner nicht richtig erkant wird, solltest du entweder ein Zeichen nehmen, dass in deinen Texten nicht vorkommt oder im SQL zusätzlich Hochkommas angeben (" cats("'",sachbearbeiter."'") into ). Selbst wenn dein Code keine Fehler enthalten hätte, wären nicht die richtigen Werte zurückgeliefert worden, da das Leerzeichen auch in den Texten vorkommt. Texte, die zur Kompilierungszeit noch nicht bekannt sind, müssen innerhalb von Macros maskiert werden, damit zur Laufzeit des Macros der Text nicht missinterpretiert wird. In dem Beispiel ist die Quotierung nötig, da als Trenner das Komma genommen wurde. Der Aufruf ohne Quotierung würde mit der Fehlermeldung "Macro function %SCAN has too many arguments." enden. Falls alles nicht hilft, eventuell auch SAS beenden und neu starten. Bei der Entwicklung von Macros kann man SAS ziemlich durcheinanderbringen. Und grundsätzlich gilt: Alles was ohne Macros zu lösen geht, sollte man auch ohne Macros lösen. data test; input sachbearbeiter $1-20; cards; Peter Muster Petra Musterli Peter Musterli Perer Muster %macro Test();

%local sachbearbeiter keys3 anz3 k; Proc sql noprint; select sachbearbeiter into :keys3 separated by ',' from test; %let anz3 = &sqlobs.; %do k = 1 %to &anz3.; %let sachbearbeiter = %scan(%nrquote(&keys3.),&k.,%str(,)); %put &Sachbearbeiter.; %end; %mend; %test; Scöne Grüße Jan