2016-07-18 6 views
-2

Lieblinge I 7 Datensätze erstellen muß (local, web, call, local&call, local&web, call&web, all), je nachdem, ob der Kunde einen Kanal aus den folgenden Probendaten verwendet wird.SAS: Gruppenzeilen in verschiedene Datensätze von Bedingung

| customer | call | local | web | 
|----------|------|-------|-----| 
|  1 | 1 | 1 | 1 | 
|  1 |  | 1 | 1 | 
|  1 |  | 1 |  | 
|  2 | 1 |  | 1 | 
|  2 |  | 1 |  | 
|  2 | 1 |  |  | 
|  3 |  |  | 1 | 
|  3 | 1 | 1 |  | 

please see this picture for more details on the sample table

Also, wenn ein Kunde alle drei Kanäle in einem Fall und in dem anderen Fall verwendet hat er verwendet nur einer von ihnen, dann wird diese Reihe mit dem Kunden = 1 sollte the'all gehen‘ Datensatz. Ähnlich wie bei 3, wenn er lokal und web in einer Instanz und nur web in einer anderen Instanz verwendet hat, dann sollte es in den Datensatz local&web gehen.

Kunden-IDs sollte nicht in anderen Daten-Set d Kunden 1 dupliziert werden kann eines des Datenmenge nur welken gehört.

Ich bin mit diesem steckt, kann mir jemand gibt einen Ausschnitt von SAS- oder SQL-Code weiter verfahren ist.

Danke!

+0

'Fall, wenn max (Call) = 1, dann 1 sonst 0 Ende + Fall, wenn max (local) = 1, dann 2 sonst 0 end + case wenn max (web) = 1 dann 4 else 0 end 'Dies ist ein SQL-Ansatz, da ich sehr wenig über SAS weiß. – shawnt00

+0

Bitte senden Sie die Beispieldaten in der Post, nicht als Bild, und fügen Sie ein, was die erwartete Ausgabe sein soll. Warum erstellen Sie separate Datensätze? In SAS ist dies selten eine gute Idee. Sie können BY-Gruppen weiter verwenden, um Daten effizienter zu verarbeiten als in mehreren Datensätzen. – Reeza

+0

Gehen nicht alle 3 in Ihrer Probe auf 'ALL'? – Reeza

Antwort

0

Wenn alle drei gehen auf "alle", dann Aggregation verwenden:

select customer, 
     (case when max(call) > 0 and max(local) > 0 and max(web) > 0 then 'all' 
      else concat_ws('&', (case when max(call) > 0 then 'call' end), 
          (case when max(local) > 0 then 'local' end), 
          (case when max(web) > 0 then 'web' end) 
          ) 
     end) as grp 
from t 
group by customer; 
+0

Hey Godron, wie würdest du es für dieses Szenario schreiben - 'customer1' hat die erste Instanz von (call, local, web) als (0,1,1) und zweite Instanz als (0,0,1) In diesem Fall Ich möchte, dass es nur zu "local_web" geht. – newbie49

+0

@ newbie49. . . Neue Fragen sollten als Fragen gestellt werden, nicht als Kommentare. –

Verwandte Themen