2016-11-22 2 views
0

Ich würde gerne wissen, ob es möglich ist, mehrere Zuweisungen als Folge eines einzigen CASE auszuführen. Das heißt, anstatt zwei CASE-Anweisungen zu haben, haben Sie eine einzelne CASE-Anweisung mit einer "then-do-end" -ähnlichen Struktur.SAS: PROC SQL Mehrere Zuweisungen als Folge eines einzigen CASE

Zum Beispiel, wie würde ich thing1 und thing2 basierend auf x innerhalb einer einzigen CASE-Anweisung zuweisen?

data example; 
    input x $; 

    datalines; 
    A 
    A 
    A 
    B 
    B 
    ; 
run; 

proc sql; 
    create table make_two_from_one as 
    select * 
    , case 
     when x = 'A' then 'Result1A' 
     when x = 'B' then 'Result1B' 
     else 'Error' 
    end as thing1 
    , case 
     when x = 'A' then 'Result2A' 
     when x = 'B' then 'Result2B' 
     else 'Error' 
    end as thing2 
    from example 
    ; 
quit; 
+1

Leider funktioniert SQL nicht so. –

+0

Konnten Sie einfach Zählungen in einer Gruppe hinzufügen; Wählen Sie dann die Kombination aus dem Wert und seiner Anzahl? (Für den ersten Teil, siehe hier: http://stackoverflow.com/questions/17006765/get-a-the-row-number-in-a-data-step-using-sas) – johnjps111

+0

Oder Sie könnten dies innerhalb tun ein Datenschritt, da SQL nichts besitzt, was ein Datenschritt nicht einfach replizieren könnte. – Reeza

Antwort

1

Case-Anweisung erstellt eine Variable.

Für Ihr Beispiel können Sie dies versuchen, mit einer Erklärung des Falles:

data example; 
    input x $; 

    datalines; 
    A 
    A 
    A 
    B 
    B 
    ; 
run; 

proc sql; 
    create table make_two_from_one_2 as 
    select * 
    , case 
     when x = 'A' then 'Result1A,Result2A' 
     when x = 'B' then 'Result1B,Result2B' 
     else 'Error' 
    end as thing0 

    from example 
    ; 
quit; 

data example1(drop=thing0); 
    set make_two_from_one_2; 
    thing1=scan(thing0,1,','); 
    thing2=scan(thing0,2,','); 
run; 
0

In Ihrem Fall, vielleicht könnten Sie dies versuchen:

proc sql; 
    create table make_two_from_one as 
    select * 
    , case 
     when x = 'A' then 'Result1A' 
     when x = 'B' then 'Result1B' 
     else 'Error' 
    end as thing1, 
    translate(calculated thing1,'2','1') as thing2 
    from example 
    ; 
quit; 
0

Ich persönlich denke, dieses Bedürfnis, das heißt, um eine umständliche syntaktische Barriere mit etwas zu überwinden, das an einem Ort aufrechterhalten werden kann, ist ein guter Anwendungsfall für SAS-Makro.

Die Makroversion vermeidet auch die Gefahren des Parsens, ist schön tabellarisch und macht keine Typannahmen.

%macro _case(when_A, when_B, error='Error'); 
     case 
      when x = 'A' then &when_A 
      when x = 'B' then &when_B 
      else &error 
     end 
%mend; 

proc sql; 
    create table make_two_from_one_v2 as 
    select * 
    , %_case('Result1A', 'Result1B') as thing1 
    , %_case('Result2A', 'Result2B') as thing2 
    from example 
    ; 
quit; 
3

Nur der Vollständigkeit halber ist diese einfach in einem Daten Schritt, mit select, when, do, otherwise. Oder Sie könnten einfach if, then, do, else verwenden.

data want; 
set example; 
select (x); 
    when ('A') do; 
     thing1 = 'Result1A'; 
     thing2 = 'Result2A'; 
     end; 
    when ('B') do; 
     thing1 = 'Result1B'; 
     thing2 = 'Result2B'; 
     end; 
    otherwise do; 
     thing1 = 'Error'; 
     thing2 = 'Error'; 
     end; 
end; 
run; 
+0

Die anderen Antworten bieten allgemeinere Lösungen, aber dies ist die beste Antwort für die spezifische ursprüngliche Frage. D. h., Wenn Sie eine lineare Traversierung einer einzelnen Tabelle ohne Zusammenführung haben, schlägt nichts den Datenschritt. Dies ist auch der klarste und eleganteste Code, wenn Sie mehrere Spalten basierend auf dem Wert einer vorhandenen Spalte hinzufügen müssen. – Leo