LesezeichenAbonnierenRSS-Feed abonnieren
Katrin11
Calcite | Level 5

Hallo zusammen,

 

mir liegt ein Material vor, das unter anderem die Variablen Produktgruppe, Produkt, Qualität, Kennnummer und Umsatz enthält.

Jede Produktgruppe besteht aus Produkten, die unterteilt sind in verschiedene Qualitäten (1, 2, 3, 4).

In den Datensätzen mit Qualität 4 sollen die Daten der Datensätze mit Qualität 2 und 3 zusammengefasst werden.

Die Variable Kennnummer ist nur bei Produkten der Qualität 1 - 3 belegt, die Datensätze mit der Qualität 4 haben bisher keine Kennnummer angegeben.

Hier ein Beispiel:

 

Produktgruppe       Produkt       Qualität     Kennnummer     Umsatz

         1                        1                   1                  3                      14

         2                        2                   2                  5                      17

         2                        3                   3                  8                      25

         2                        4                   3                 10                     13

         2                        5                   4                                                 

         3                        6                   1             

         4                        7                   2                  11                     16

         4                        8                   4             

         5                        9                   2                   

         5                       10                  3                   4                       3

         5                       11                  4

 

Nun soll die Kennnummer in die Datensätze übertragen werden, die die Qualität 4 besitzen. In den Fällen, in denen mehrere Produkte mit Qualität 2 und 3 zu einer Produktgruppe gehören, soll die Kennnummer ausgewählt werden, zu deren Datensatz der größte Umsatz gehört.

Das Ergebnis sollte somit folgendermaßen aussehen:

 

Produktgruppe       Produkt       Qualität     Kennnummer     Umsatz

         1                        1                   1                  3                      14

         2                        2                   2                  5                      17

         2                        3                   3                  8                      25

         2                        4                   3                 10                     13

         2                        5                   4                  8                       25                        

         3                        6                   1             

         4                        7                   2                  11                     16

         4                        8                   4                  11                     16

         5                        9                   2                   

         5                       10                  3                   4                       3

         5                       11                  4                   4                       3

 

Ich habe bisher versucht, das Problem mit retain zu lösen, allerdings liefert das bei mir nicht das gewünschte Ergebnis.

 

Vielen Dank für Eure Hilfe und viele Grüße

 

Katrin

 

 

 

5 ANTWORTEN 5
CKothenschulte
Obsidian | Level 7

Guten Morgen @Katrin11 ,

 

mit den obigen Testdaten

data EINGABE;
infile datalines truncover;
input Produktgruppe Produkt Qualitaet Kennnummer Umsatz;
datalines;
1 1 1 3 14
2 2 2 5 17
2 3 3 8 25
2 4 3 10 13
2 5 4
3 6 1
4 7 2 11 16
4 8 4
5 9 2
5 10 3 4 3
5 11 4
;
run;

funktioniert meine Lösung.

Zunächst sortiere ich nach Produktgruppe, Produkt und Qualität.

proc sort data=EINGABE;
  by Produktgruppe Produkt Qualitaet;
run;

Anschließend nutze ich RETAIN und einen Gruppenwechsel.

data AUSGABE (drop=R_Umsatz R_Kennnummer);
  set EINGABE;
  by Produktgruppe Produkt Qualitaet;
  retain R_Kennnummer R_Umsatz;
  if first.PRODUKTGRUPPE then do;
    R_Kennnummer = Kennnummer;
    R_Umsatz = Umsatz;
  end;

  if Umsatz gt R_Umsatz then do;
    R_Umsatz = Umsatz;
    R_Kennnummer = Kennnummer;
  end;
    
  if Qualitaet eq 4 then do;
    Kennnummer = R_Kennnummer;
    Umsatz = R_Umsatz;
  end;

run;

Das ist sicher noch nicht die perfekte Lösung, dient aber bestimmt als Hilfestellung.

 

Viel Erfolg!

CKothenschulte
Obsidian | Level 7

Gerade noch gesehen, dass Qualität = 1 nicht berücksichtigt werden soll:

data AUSGABE (drop=R_Umsatz R_Kennnummer);
  set EINGABE;
  by Produktgruppe Produkt Qualitaet;
  retain R_Kennnummer R_Umsatz;
  if first.PRODUKTGRUPPE then do;
    R_Kennnummer = 0;
    R_Umsatz = 0;
  end;

  if Umsatz gt R_Umsatz and Qualitaet ne 1 then do;
    R_Umsatz = Umsatz;
    R_Kennnummer = Kennnummer;
  end;
    
  if Qualitaet eq 4 then do;
    Kennnummer = R_Kennnummer;
    Umsatz = R_Umsatz;
  end;

run;
mfab
Quartz | Level 8

hier ein Beispiel mit SQL:

 

proc sql;
create table maxquali as
select produktgruppe,
       kennnummer,
       umsatz
  from eingabe
 where qualitaet <> 1
 group by produktgruppe
having umsatz = max(umsatz);
quit;

proc sql;
create table want as
select a.produktgruppe,
       a.produkt,
	   a.qualitaet,
	   coalesce(a.kennnummer, b.kennnummer) as kennnummer,
	   coalesce(a.umsatz, b.umsatz) as umsatz
  from eingabe a left join maxquali b
    on a.produktgruppe = b.produktgruppe
   and a.qualitaet = 4
;
quit;

 

Es stellt sich natürlich die Frage, was passieren soll, wenn zwei Kennnummern pro Produktgruppe den gleichen (maximalen) Umsatz besitzen. Im SQL-Beispiel hier würden die Eingabesätze vervielfacht. 

mfab
Quartz | Level 8

@CKothenschulte 

müsste die Sortierung nicht nach Umsatz sein? Bzw. nach Produkt darf m.E. nicht sortiert werden, ansonsten könnte folgende Datenlage keine sauberen Ergebnisse liefern:

data EINGABE;
infile datalines truncover;
input Produktgruppe Produkt Qualitaet Kennnummer Umsatz;
datalines;
1 1 1 3 14
2 2 2 5 17
2 3 3 10 13
2 3 4
2 4 3 8 25
2 5 4
;
run;

 

Ich hätte es so vorgeschlagen:


proc sort data=eingabe;
  by produktgruppe qualitaet descending umsatz;
run;

anschliessend passt der DataStep (mit entsprechender Anpassung des by-Statements) dann wieder 🙂

 

CKothenschulte
Obsidian | Level 7

Hallo @mfab ,

 

die Aufgabenstellung erscheint mir da nicht eindeutig Smiley (zwinkernd)

 

Nach nochmaligen Lesen komme ich auch zu dem Schluss, dass die Variable Produkt egal ist.

Von daher ist die neue Lösung noch besser. Danke!