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
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!
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;
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.
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 🙂
Hallo @mfab ,
die Aufgabenstellung erscheint mir da nicht eindeutig
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!
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!