LesezeichenAbonnierenRSS-Feed abonnieren
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
Margaretha_97
Fluorite | Level 6

Hallo zusammen,

 

ich möchte aus einer großen Tabelle mit mehreren hundert Variablen bestimmte Variablen filtern und eine neue Variable erzeugen. Das Filtern der Daten klappt inzwischen super und ich erhalte eine neue Tabelle, die nur meine gewünschten Variablen enthält.

Eine dieser Variablen heißt typ_alter und beschreibt das Patientenalter jeweils in 5-Jahres Schritten. Aus dieser Variablen möchte ich nun eine neue mit dem Namen typ_alter_neu erzeugen, die das Patientenalter jedoch in 10-Jahres Schritten angibt. Dafür habe ich folgende Syntax geschrieben:

 

libname Haase 'C:\Users\Margaretha\Desktop\FDZ\DRG\Data';
PROC SQL;
CREATE TABLE Daten_2007 AS
SELECT sex, 
       typ_alter, 
       pat_land, 
	 icd_hd,
	   (CASE
	   IF '22' = typ_alter THEN 'j'
	   IF typ_alter >= '1' AND typ_alter <= '3' THEN 'a'
	   IF typ_alter >= '4' AND typ_alter <= '5' THEN 'b'
	   IF typ_alter >= '6' AND typ_alter <= '7' THEN 'c'
	   IF typ_alter >= '8' AND typ_alter <= '9' THEN 'd'
	   IF typ_alter >= '10' AND typ_alter <= '11' THEN 'e'
	   IF typ_alter >= '12' AND typ_alter <= '13' THEN 'f'
	   IF typ_alter >= '14' AND typ_alter <= '15' THEN 'g'
	   IF typ_alter >= '16' AND typ_alter <= '17' THEN 'h'
	   IF typ_alter >= '18' AND typ_alter <= '21' THEN 'i'
	   ELSE typ_alter
	   END) AS typ_alter_neu
FROM Haase.Drg2007_3846_sf;
QUIT;
PROC print;
RUN;

Wenn ich dieses Programm laufen lassen will, wird mir im Log-Fenster folgendes angezeigt:

 

219  PROC print;
ERROR: Keine Standardeinlesedatei vorhanden (_LAST_ is _NULL_).
220  RUN;

NOTE: The SAS System stopped processing this step because of errors.
NOTE: PROZEDUR PRINT used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds

Wenn ich allerdings die IF – THEN Bedingung weglasse und das Programm starte, erhalte ich eine Tabelle mit den ausgewählten Variablen. Füge ich dann die IF – THEN Bedingung hinzu, erhalte ich trotzdem nur die alte Tabelle ohne die neu definierte Variable und im Log-Fenster wird mir folgendes angezeigt:

 

233  libname Haase 'C:\Users\Margaretha\Desktop\FDZ\DRG\Data';
NOTE: Libref HAASE was successfully assigned as follows:
      Engine:        V9
      Physical Name: C:\Users\Margaretha\Desktop\FDZ\DRG\Data
234  PROC SQL;
235  CREATE TABLE Daten_2007 AS
236  SELECT sex,
237         typ_alter,
238         pat_land,
239         icd_hd,
240         (CASE
241         IF '22' = typ_alter THEN 'j'
               ----
               22
               76
ERROR 22-322: Syntax error, expecting one of the following: !, !!, &, (, *, **, +, -, /, <,
              <=, <>, =, >, >=, AND, EQ, EQT, GE, GET, GT, GTT, LE, LET, LT, LTT, NE, NET, OR,
              WHEN, ^=, |, ||, ~=.

ERROR 76-322: Syntax error, statement will be ignored.

242         IF typ_alter >= '1' AND typ_alter <= '3' THEN 'a'
243         IF typ_alter >= '4' AND typ_alter <= '5' THEN 'b'
244         IF typ_alter >= '6' AND typ_alter <= '7' THEN 'c'
245         IF typ_alter >= '8' AND typ_alter <= '9' THEN 'd'
246         IF typ_alter >= '10' AND typ_alter <= '11' THEN 'e'
247         IF typ_alter >= '12' AND typ_alter <= '13' THEN 'f'
248         IF typ_alter >= '14' AND typ_alter <= '15' THEN 'g'
249         IF typ_alter >= '16' AND typ_alter <= '17' THEN 'h'
250         IF typ_alter >= '18' AND typ_alter <= '21' THEN 'i'
251         ELSE typ_alter
252         END) AS typ_alter_neu
253
254  FROM Haase.Drg2007_3846_sf;
255  QUIT;
NOTE: The SAS System stopped processing this step because of errors.
NOTE: PROZEDUR SQL used (Total process time):
      real time           0.02 seconds
      cpu time            0.01 seconds



256  PROC print;
257  RUN;

NOTE: There were 200 observations read from the data set WORK.DATEN_2007.
NOTE: PROZEDUR PRINT used (Total process time):
      real time           0.05 seconds
      cpu time            0.04 seconds

Kann mir jemand bei diesem Problem helfen?

Vielen Dank und einen guten Start in die Woche!

 

 

1 AKZEPTIERTE LÖSUNG

Akzeptierte Lösungen
Criptic
Lapis Lazuli | Level 10

Kann es sein, dass das Feld typ_alter nummerisch ist?
Falls ja nimm einfach die Anführungszeichen weg - das sieht für mich nach einem Typ-Missmatch aus.

Um es an einem Beispiel zu verdeutlich mit aa1 funktioniert es, mit aa2 kommt deine Fehlermeldung weil du hier dann Num mit Char vergleichst.

data work.aa1;
input typ_alter $3.;
length typ_alter $3.;
datalines;
1
4
10
22
108
15
;
run;

data work.aa2;
input typ_alter;
datalines;
1
4
10
22
108
15
;
run;

PROC SQL;
	CREATE TABLE Daten_2007 AS
		SELECT typ_alter, 
		CASE
			WHEN typ_alter >= '1' AND typ_alter <= '3' THEN 'a'
			WHEN typ_alter >= '4' AND typ_alter <= '5' THEN 'b'
			WHEN typ_alter >= '6' AND typ_alter <= '7' THEN 'c'
			WHEN typ_alter >= '8' AND typ_alter <= '9' THEN 'd'
			WHEN typ_alter >= '10' AND typ_alter <= '11' THEN 'e'
			WHEN typ_alter >= '12' AND typ_alter <= '13' THEN 'f'
			WHEN typ_alter >= '14' AND typ_alter <= '15' THEN 'g'
			WHEN typ_alter >= '16' AND typ_alter <= '17' THEN 'h'
			WHEN typ_alter >= '18' AND typ_alter <= '21' THEN 'i'
			WHEN typ_alter = '22' THEN 'j'
			ELSE typ_alter
		END 
	AS typ_alter_neu   
		FROM work.aa1;
QUIT;

Lösung in ursprünglichem Beitrag anzeigen

13 ANTWORTEN 13
Criptic
Lapis Lazuli | Level 10

Hallo @Margaretha_97 ,

 

in proc sql funktioniert dies über case when - Beispiel:

proc sql;
   select Name, case
                when Continent = 'North America' then 'Continental U.S.'
                when Continent = 'Oceania' then 'Pacific Islands'
                else 'None'
                end as Region
      from states;
quit;

Hoffe das hilft weiter. If-Statements wären im Data Step.

 

Viele Grüße

Criptic

Margaretha_97
Fluorite | Level 6

Hallo @Criptic ,

vielen Dank für die schnelle Antwort!

Ich habe das IF jetzt durch WHEN ersetzt und mich an Deiner Beispielsyntax orientiert und folgende Syntax verwendet:

libname Haase 'C:\Users\Margaretha\Desktop\FDZ\DRG\Data';
PROC SQL;
CREATE TABLE Daten_2007 AS
SELECT sex, 
       icd_hd, 
       pat_land, 
       typ_alter, CASE
		      WHEN typ_alter >= '1' AND typ_alter <= '3' THEN 'a'
	   	      WHEN typ_alter >= '4' AND typ_alter <= '5' THEN 'b'
	   	      WHEN typ_alter >= '6' AND typ_alter <= '7' THEN 'c'
	              WHEN typ_alter >= '8' AND typ_alter <= '9' THEN 'd'
	              WHEN typ_alter >= '10' AND typ_alter <= '11' THEN 'e'
	              WHEN typ_alter >= '12' AND typ_alter <= '13' THEN 'f'
	              WHEN typ_alter >= '14' AND typ_alter <= '15' THEN 'g'
	              WHEN typ_alter >= '16' AND typ_alter <= '17' THEN 'h'
	              WHEN typ_alter >= '18' AND typ_alter <= '21' THEN 'i'
		      WHEN typ_alter = '22' THEN 'j'
	              ELSE typ_alter
	              END AS typ_alter_neu   
FROM Haase.Drg2007_3846_sf;
QUIT;
PROC print;
RUN;

 

Leider klappt es noch nicht, im Log-Fenster steht jetzt folgendes:

35   libname Haase 'C:\Users\Margaretha\Desktop\FDZ\DRG\Data';
NOTE: Libref HAASE was successfully assigned as follows:
      Engine:        V9
      Physical Name: C:\Users\Margaretha\Desktop\FDZ\DRG\Data
36   PROC SQL;
37   CREATE TABLE Daten_2007 AS
38   SELECT sex,
39          icd_hd,
40          pat_land,
41          typ_alter, CASE
42                     WHEN typ_alter >= '1' AND typ_alter <= '3' THEN 'a'
43                     WHEN typ_alter >= '4' AND typ_alter <= '5' THEN 'b'
44                     WHEN typ_alter >= '6' AND typ_alter <= '7' THEN 'c'
45                     WHEN typ_alter >= '8' AND typ_alter <= '9' THEN 'd'
46                     WHEN typ_alter >= '10' AND typ_alter <= '11' THEN 'e'
47                     WHEN typ_alter >= '12' AND typ_alter <= '13' THEN 'f'
48                     WHEN typ_alter >= '14' AND typ_alter <= '15' THEN 'g'
49                     WHEN typ_alter >= '16' AND typ_alter <= '17' THEN 'h'
50                     WHEN typ_alter >= '18' AND typ_alter <= '21' THEN 'i'
51                     WHEN typ_alter = '22' THEN 'j'
52                     ELSE typ_alter
53                     END AS typ_alter_neu
54   FROM Haase.Drg2007_3846_sf;
NOTE: Datei HAASE.DRG2007_3846_SF.DATA besitzt das systemeigene Format eines anderen Host, oder
      die Dateicodierung entspricht nicht der Sitzungscodierung. Cross Environment Data Access
      wird verwendet. Dies kann weitere CPU-Ressourcen erfordern und die Performance wird
      beeinträchtigt.
ERROR: Expression using IN has components that are of different data types.
NOTE: The IN referred to may have been transformed from an OR to an IN at some point during
      PROC SQL WHERE clause optimization.
ERROR: Expression using IN has components that are of different data types.
NOTE: The IN referred to may have been transformed from an OR to an IN at some point during
      PROC SQL WHERE clause optimization.
ERROR: Expression using IN has components that are of different data types.
NOTE: The IN referred to may have been transformed from an OR to an IN at some point during
      PROC SQL WHERE clause optimization.
ERROR: Expression using IN has components that are of different data types.
NOTE: The IN referred to may have been transformed from an OR to an IN at some point during
      PROC SQL WHERE clause optimization.
ERROR: Expression using IN has components that are of different data types.
NOTE: The IN referred to may have been transformed from an OR to an IN at some point during
      PROC SQL WHERE clause optimization.
ERROR: Expression using IN has components that are of different data types.
NOTE: The IN referred to may have been transformed from an OR to an IN at some point during
      PROC SQL WHERE clause optimization.
ERROR: Expression using IN has components that are of different data types.
NOTE: The IN referred to may have been transformed from an OR to an IN at some point during
      PROC SQL WHERE clause optimization.
ERROR: Expression using IN has components that are of different data types.
NOTE: The IN referred to may have been transformed from an OR to an IN at some point during
      PROC SQL WHERE clause optimization.
ERROR: Expression using IN has components that are of different data types.
NOTE: The IN referred to may have been transformed from an OR to an IN at some point during
      PROC SQL WHERE clause optimization.
ERROR: Expression using equals (=) has components that are of different data types.
ERROR: Result of WHEN clause 11 is not the same data type as the preceding results.
55   QUIT;
NOTE: The SAS System stopped processing this step because of errors.
NOTE: PROZEDUR SQL used (Total process time):
      real time           0.04 seconds
      cpu time            0.04 seconds



56   PROC print;
57   RUN;

NOTE: There were 200 observations read from the data set WORK.DATEN_2007.
NOTE: PROZEDUR PRINT used (Total process time):
      real time           0.05 seconds
      cpu time            0.06 seconds

Hättest Du eine Idee, woran es trotz der nun geänderten Syntax liegen kann?

Liebe Grüße

Criptic
Lapis Lazuli | Level 10

Kann es sein, dass das Feld typ_alter nummerisch ist?
Falls ja nimm einfach die Anführungszeichen weg - das sieht für mich nach einem Typ-Missmatch aus.

Um es an einem Beispiel zu verdeutlich mit aa1 funktioniert es, mit aa2 kommt deine Fehlermeldung weil du hier dann Num mit Char vergleichst.

data work.aa1;
input typ_alter $3.;
length typ_alter $3.;
datalines;
1
4
10
22
108
15
;
run;

data work.aa2;
input typ_alter;
datalines;
1
4
10
22
108
15
;
run;

PROC SQL;
	CREATE TABLE Daten_2007 AS
		SELECT typ_alter, 
		CASE
			WHEN typ_alter >= '1' AND typ_alter <= '3' THEN 'a'
			WHEN typ_alter >= '4' AND typ_alter <= '5' THEN 'b'
			WHEN typ_alter >= '6' AND typ_alter <= '7' THEN 'c'
			WHEN typ_alter >= '8' AND typ_alter <= '9' THEN 'd'
			WHEN typ_alter >= '10' AND typ_alter <= '11' THEN 'e'
			WHEN typ_alter >= '12' AND typ_alter <= '13' THEN 'f'
			WHEN typ_alter >= '14' AND typ_alter <= '15' THEN 'g'
			WHEN typ_alter >= '16' AND typ_alter <= '17' THEN 'h'
			WHEN typ_alter >= '18' AND typ_alter <= '21' THEN 'i'
			WHEN typ_alter = '22' THEN 'j'
			ELSE typ_alter
		END 
	AS typ_alter_neu   
		FROM work.aa1;
QUIT;
Margaretha_97
Fluorite | Level 6

Das Problem ist gelöst! Es lag daran, dass die neu gebildete Variable nicht numerisch, sondern alphanumerisch war.

Ich habe die Buchstaben durch Zahlen ersetzt und entsprechend die Hochkommata entfernt, wie@Criptic es vorgeschlagen hatte.

Vielen Dank an alle für die umfangreiche Hilfe. Ohne Eure geduldige Hilfe wäre ich verzweifelt...

Liebe Grüße und einen schönen Abend

jh_ti_bw
Obsidian | Level 7
CREATE TABLE Daten_2007 AS
SELECT sex, 
        typ_alter, 
        pat_land, 
        icd_hd,
	   (CASE 
            WHEN typ_alter  =  '22'             THEN 'j'
            WHEN typ_alter in ( '1',  '2', '3') THEN 'a'
            WHEN typ_alter in ( '4',  '5'     ) THEN 'b'
            WHEN typ_alter in ( '6',  '7'     ) THEN 'c'
            WHEN typ_alter in ( '8',  '9'     ) THEN 'd'
            WHEN typ_alter in ('10', '11'     ) THEN 'e'
            WHEN typ_alter in ('12', '13'     ) THEN 'f'
            WHEN typ_alter in ('14', '15'     ) THEN 'g'
            WHEN typ_alter in ('16', '17'     ) THEN 'h'
            WHEN typ_alter in ('18', '19, '20, '21'     ) THEN 'i'
            ELSE typ_alter
	   END) AS typ_alter_neu
FROM Haase.Drg2007_3846_sf;
Margaretha_97
Fluorite | Level 6

Hallo @jh_ti_bw,

vielen Dank für die schnelle Antwort. Ich habe meine Syntax entsprechend geändert:

libname Haase 'C:\Users\Margaretha\Desktop\FDZ\DRG\Data';
PROC SQL;
CREATE TABLE Daten_2007 AS
SELECT sex, 
       icd_hd, 
       pat_land, 
	   typ_alter,
	   (CASE 
            WHEN typ_alter  =  '22'             THEN 'j'
            WHEN typ_alter in ( '1',  '2', '3') THEN 'a'
            WHEN typ_alter in ( '4',  '5'     ) THEN 'b'
            WHEN typ_alter in ( '6',  '7'     ) THEN 'c'
            WHEN typ_alter in ( '8',  '9'     ) THEN 'd'
            WHEN typ_alter in ('10', '11'     ) THEN 'e'
            WHEN typ_alter in ('12', '13'     ) THEN 'f'
            WHEN typ_alter in ('14', '15'     ) THEN 'g'
            WHEN typ_alter in ('16', '17'     ) THEN 'h'
            WHEN typ_alter in ('18', '19', '20', '21'     ) THEN 'i'
            ELSE typ_alter
	   END) AS typ_alter_neu 
FROM Haase.Drg2007_3846_sf;
QUIT;
PROC print;
RUN;

Leider erhalte ich noch keine Tabelle mit der neuen Variablen und im Log-Fenster wird mir folgende Fehlermeldung angezeigt:

37   libname Haase 'C:\Users\Margaretha\Desktop\FDZ\DRG\Data';
NOTE: Libref HAASE was successfully assigned as follows:
      Engine:        V9
      Physical Name: C:\Users\Margaretha\Desktop\FDZ\DRG\Data
38   PROC SQL;
39   CREATE TABLE Daten_2007 AS
40   SELECT sex,
41          icd_hd,
42          pat_land,
43          typ_alter,
44          (CASE
45               WHEN typ_alter  =  '22'             THEN 'j'
46               WHEN typ_alter in ( '1',  '2', '3') THEN 'a'
47               WHEN typ_alter in ( '4',  '5'     ) THEN 'b'
48               WHEN typ_alter in ( '6',  '7'     ) THEN 'c'
49               WHEN typ_alter in ( '8',  '9'     ) THEN 'd'
50               WHEN typ_alter in ('10', '11'     ) THEN 'e'
51               WHEN typ_alter in ('12', '13'     ) THEN 'f'
52               WHEN typ_alter in ('14', '15'     ) THEN 'g'
53               WHEN typ_alter in ('16', '17'     ) THEN 'h'
54               WHEN typ_alter in ('18', '19', '20', '21'     ) THEN 'i'
55               ELSE typ_alter
56          END) AS typ_alter_neu
57   FROM Haase.Drg2007_3846_sf;
NOTE: Datei HAASE.DRG2007_3846_SF.DATA besitzt das systemeigene Format eines anderen Host, oder
      die Dateicodierung entspricht nicht der Sitzungscodierung. Cross Environment Data Access
      wird verwendet. Dies kann weitere CPU-Ressourcen erfordern und die Performance wird
      beeinträchtigt.
ERROR: Expression using equals (=) has components that are of different data types.
ERROR: Expression using IN has components that are of different data types.
NOTE: The IN referred to may have been transformed from an OR to an IN at some point during
      PROC SQL WHERE clause optimization.
ERROR: Expression using IN has components that are of different data types.
NOTE: The IN referred to may have been transformed from an OR to an IN at some point during
      PROC SQL WHERE clause optimization.
ERROR: Expression using IN has components that are of different data types.
NOTE: The IN referred to may have been transformed from an OR to an IN at some point during
      PROC SQL WHERE clause optimization.
ERROR: Expression using IN has components that are of different data types.
NOTE: The IN referred to may have been transformed from an OR to an IN at some point during
      PROC SQL WHERE clause optimization.
ERROR: Expression using IN has components that are of different data types.
NOTE: The IN referred to may have been transformed from an OR to an IN at some point during
      PROC SQL WHERE clause optimization.
ERROR: Expression using IN has components that are of different data types.
NOTE: The IN referred to may have been transformed from an OR to an IN at some point during
      PROC SQL WHERE clause optimization.
ERROR: Expression using IN has components that are of different data types.
NOTE: The IN referred to may have been transformed from an OR to an IN at some point during
      PROC SQL WHERE clause optimization.
ERROR: Expression using IN has components that are of different data types.
NOTE: The IN referred to may have been transformed from an OR to an IN at some point during
      PROC SQL WHERE clause optimization.
ERROR: Expression using IN has components that are of different data types.
NOTE: The IN referred to may have been transformed from an OR to an IN at some point during
      PROC SQL WHERE clause optimization.
ERROR: Result of WHEN clause 11 is not the same data type as the preceding results.
58   QUIT;
NOTE: The SAS System stopped processing this step because of errors.
NOTE: PROZEDUR SQL used (Total process time):
      real time           0.06 seconds
      cpu time            0.04 seconds



59   PROC print;
60   RUN;

NOTE: There were 200 observations read from the data set WORK.DATEN_2007.
NOTE: PROZEDUR PRINT used (Total process time):
      real time           0.05 seconds
      cpu time            0.04 seconds

Wo könnte mein Fehler liegen?

Liebe Grüße

andreas_lds
Jade | Level 19

@Margaretha_97: Das Problem schreit danach mit einem Format gelöst zu werden. Allerdings würde ich die Variable typ_alter zunächst von char nach numerisch konvertieren, die Reihenfolge von Zahlen in alphanumerischen Variablen ist nicht immer so, wie gehofft/erwartet. Der nachfolgende Code ist leider nicht getestet:

proc format;
	value AlterTyp
		1 - 3 = 'a'
		4 - 5 = 'b'
		6 - 7 = 'c'
		...
		22 = 'j'
		other = ' '
	;
run;

data work.Daten_2007;
  set Haase.Drg2007_3846_sf(keep= typ_alter pat_land icd_hd);
  length typ_alter_neu $ 1;
  
  typ_alter_neu = put(input(typ_alter, 2.), AlterTyp.);
run;
Margaretha_97
Fluorite | Level 6

Hallo @andreas_lds,

vielen Dank für den Tip!

Immerhin wird mir jetzt schon eine Spalte mit der Variablen typ_alter_neu angezeigt, in der jedoch keine Werte enthalten sind...

Ich habe scbon verschiedene Möglichkeiten versucht, aber probiere es weiter.

Liebe Grüße

andreas_lds
Jade | Level 19

Kannst du das Log von dem Lauf posten? Vielleicht fällt einem von uns etwas auf.

Margaretha_97
Fluorite | Level 6

Hallo @andreas_lds,

hier das Log-Fenster:

187  libname Haase 'C:\Users\Margaretha\Desktop\FDZ\DRG\Data';
NOTE: Libref HAASE was successfully assigned as follows:
      Engine:        V9
      Physical Name: C:\Users\Margaretha\Desktop\FDZ\DRG\Data
188  PROC format;
189  value AlterTyp
190  1 - 3 = 'a'
191  4 - 5 = 'b'
192  6 - 7 = 'c'
193  8 - 9 = 'd'
194  10 - 11 = 'e'
195  12 - 13 = 'f'
196  14 - 15 = 'g'
197  16 - 17 = 'h'
198  18 - 21 = 'i'
199  22 = 'j'
200  other = ' '
201  ;
NOTE: Format ALTERTYP is already on the library WORK.FORMATS.
NOTE: Format ALTERTYP has been output.
202  RUN;

NOTE: PROZEDUR FORMAT used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds


203
204  DATA Work.Daten_2007;
205  set Haase.Drg2007_3846_sf(keep= typ_alter pat_land icd_hd);
NOTE: Datei HHASE.DRG2007_3846_SF.DATA besitzt das systemeigene Format eines anderen Host, oder
      die Dateicodierung entspricht nicht der Sitzungscodierung. Cross Environment Data Access
      wird verwendet. Dies kann weitere CPU-Ressourcen erfordern und die Performance wird
      beeinträchtigt.
206  length typ_alter_neu $ 1;
207
208  typ_alter_neu = put(input(typ_alter, 2.), AlterTyp.);
209  run;

NOTE: Numeric values have been converted to character values at the places given by:
      (Line):(Column).
      208:27
NOTE: There were 200 observations read from the data set REEH.DRG2007_3846_SF.
NOTE: The data set WORK.DATEN_2007 has 200 observations and 4 variables.
NOTE: DATA statement used (Total process time):
      real time           0.03 seconds
      cpu time            0.03 seconds


210
211  PROC SQL;
212  CREATE TABLE Daten_2007 AS
213  SELECT sex,
214         typ_alter,
215         pat_land,
216         icd_hd, CASE
217                    WHEN typ_alter >= 01 AND typ_alter <= 03 THEN 'a'
218                    WHEN typ_alter >= 04 AND typ_alter <= 05 THEN 'b'
219                    WHEN typ_alter >= 06 AND typ_alter <= 07 THEN 'c'
220                    WHEN typ_alter >= 10 AND typ_alter <= 11 THEN 'e'
221                    WHEN typ_alter >= 08 AND typ_alter <= 09 THEN 'd'
222                    WHEN typ_alter >= 12 AND typ_alter <= 13 THEN 'f'
223                    WHEN typ_alter >= 14 AND typ_alter <= 15 THEN 'g'
224                    WHEN typ_alter >= 16 AND typ_alter <= 17 THEN 'h'
225                    WHEN typ_alter >= 18 AND typ_alter <= 21 THEN 'i'
226                    WHEN typ_alter = 22 THEN 'j'
227                    ELSE typ_alter
228                    END AS typ_alter_neu
229
230  FROM Haase.Drg2007_3846_sf;
NOTE: Datei HAASE.DRG2007_3846_SF.DATA besitzt das systemeigene Format eines anderen Host, oder
      die Dateicodierung entspricht nicht der Sitzungscodierung. Cross Environment Data Access
      wird verwendet. Dies kann weitere CPU-Ressourcen erfordern und die Performance wird
      beeinträchtigt.
ERROR: Result of WHEN clause 11 is not the same data type as the preceding results.
231  QUIT;
NOTE: The SAS System stopped processing this step because of errors.
NOTE: PROZEDUR SQL used (Total process time):
      real time           0.02 seconds
      cpu time            0.01 seconds



232  PROC print;
233  RUN;

NOTE: There were 200 observations read from the data set WORK.DATEN_2007.
NOTE: PROZEDUR PRINT used (Total process time):
      real time           0.05 seconds
      cpu time            0.04 seconds

Ist es überhaupt möglich, dass man die von Dir vorgeschlagene Syntax vor einem Proc SQL einfügen und zusammen mit diesem verwenden kann?

Vielen Dank für die Hilfe!

andreas_lds
Jade | Level 19

@Margaretha_97 wrote:

Hallo @andreas_lds,

hier das Log-Fenster:

ausgeschnitten

Ist es überhaupt möglich, dass man die von Dir vorgeschlagene Syntax vor einem Proc SQL einfügen und zusammen mit diesem verwenden kann?

Vielen Dank für die Hilfe!


Also eigentlich brauchst du die proc sql gar nicht mehr ....

Ersetze mal

typ_alter_neu = put(input(typ_alter, 2.), AlterTyp.)

durch

typ_alter_neu = put(typ_alter, AlterTyp.);

@FreelanceReinh hat ja schon in gewohnter Ausführlichkeit erklärt, warum die erste Zuweisung nicht funktionieren kann: weil die Variable gar nicht alphanumerisch ist.

 

FreelanceReinh
Jade | Level 19

@Margaretha_97  schrieb:

Immerhin wird mir jetzt schon eine Spalte mit der Variablen typ_alter_neu angezeigt, in der jedoch keine Werte enthalten sind...


Hallo @Margaretha_97,

 

nach den bisher gezeigten Informationen liegt das daran, dass die Variable typ_alter numerisch ist, so dass der Ausdruck 

input(typ_alter, 2.)

zunächst eine automatische Konvertierung der typ_alter-Werte in rechtsbündige Character-Werte der Länge 12 bewirkt (weil die INPUT-Funktion als erstes ein Character-Argument verlangt und 12. das numerische Default-Format für diese Umwandlung ist). Im Log erscheint sicherlich

NOTE: Numeric values have been converted to character values at the places given by: ...

(oder das deutsche Äquivalent dazu). Dann werden von diesem Character-String durch das angegebene Informat 2. nur die ersten beiden Zeichen eingelesen. Das sind aber Leerzeichen, wenn der ursprüngliche numerische Wert nicht gerade mehr als zehn Stellen (im 12.-Format) beansprucht. Diese ergeben als Funktionswert ein numerisches Missing, das vom Format AlterTyp. in den "other"-Zweig eingeordnet und somit per PUT-Funktion auf ein Character-Missing abgebildet wird.

 

Also besteht kein Bedarf, die INPUT-Funktion anzuwenden, sondern das Format AlterTyp. kann (mit der PUT-Funktion) direkt auf typ_alter angewandt werden -- wenn die Formatdefinition zu den Werten von typ_alter passt. Daher ist erst einmal der Schritt nachzuholen, der schon vor Anwendung von WHEN-, IF- oder WHERE-Bedingungen auf typ_alter hilfreich gewesen wäre: sich Klarheit über (Variablentyp und) die Werte von typ_alter zu verschaffen.

  1. proc contents data=Haase.Drg2007_3846_sf(keep=typ_alter);
    run;
    Der PROC-CONTENTS-Output liefert hier zwei wichtige Informationen: dass typ_alter numerisch ist ("Num" in Spalte "Type") und ob die Variable mit einem Format versehen ist (ggf. in Spalte "Format"), was beim Betrachten der Daten (etwa mit PROC PRINT) leicht zu Fehleinschätzungen über die tatsächlichen Werte führen kann.
  2. Ansehen von ein paar (ggf. unformatierten) Werten z. B. mit PROC PRINT:
    proc print data=Haase.Drg2007_3846_sf(obs=20);
    format typ_alter;
    var typ_alter;
    run;
    (Wenn kein Format zugeordnet ist, darf das FORMAT-Statement entfallen, es schadet aber auch nicht.)
  3. Wenn der PROC-PRINT-Output auf diskrete, etwa ganzzahlige Werte hindeutet (im Zweifelsfall mehr als die oben eingestellten 20 Sätze ansehen), mit PROC FREQ eine vollständige Übersicht erhalten:
    proc freq data=Haase.Drg2007_3846_sf;
    format typ_alter;
    tables typ_alter;
    run;
    (Gleicher Hinweis wie oben zum FORMAT-Statement.)

Anhand der von PROC FREQ gelieferten Werte kann die Formatdefinition von AlterTyp. geprüft werden. (Im Fall nicht-ganzzahliger Werte wäre besondere Vorsicht geboten.) Auch zeigen die Häufigkeiten der Werte, welche Häufigkeitsverteilung für die neue Variable typ_alter_neu zu erwarten ist. Sich diese dann per PROC FREQ (auf Daten_2007 angewandt) auch tatsächlich anzusehen und mit der Erwartung zu vergleichen, sollte selbstverständliche Routine sein.

Margaretha_97
Fluorite | Level 6

Hallo @FreelanceReinh,

danke für die Erklärung!

Die Variable typ_alter ist numerisch und hat 3 Stellen.

Ich werde es mit dem Tip von @andreas_lds versuchen zu erstellen.

Liebe Grüße

sas-innovate-2024.png

Available on demand!

Missed SAS Innovate Las Vegas? Watch all the action for free! View the keynotes, general sessions and 22 breakouts on demand.

 

Register now!

Diskussionsstatistiken
  • 13 Antworten
  • 3837 Aufrufe
  • 17 Kudos
  • 5 in Unterhaltung