BookmarkSubscribeRSS Feed
☑ This topic is solved. Need further help from the community? Please sign in and ask a new question.
lapaluna
Fluorite | Level 6

Hallo zusammen,

bin neuer User und versuche gerade, in meinen Datensatz die Spalte Sum_cum (grün) zu erstellen.

In dieser Spalte soll die Summe für verschiedene Merkmale, die im Vorfeld bestimmt werden, kumuliert werden.

Hier ein Beispiel zur Veranschaulichung:

lapaluna_0-1657894255512.png

In den Daten werden für viele Jahre nach Monaten, Department, Produkt und Verkäufer die Verkäufe (Sum) ausgegeben.

Nun möchte ich:

  • innerhalb eines Jahres (2022)
  • nach den Monaten (Januar bis Dezember) 
  • je Department
  • Produkt
  • und Verkäufer 

die Werte kumulieren und in den Daten ablegen.

Habt ihr hier einen Tipp - und auch wenn ich es besser aufbereiten soll gerne ein paar Hinweise. Ist mein erster Kommentar.

 

Danke und VG

Björn

 

1 ACCEPTED SOLUTION

Accepted Solutions
lapaluna
Fluorite | Level 6

Vielen Dank @FreelanceReinh ,

lapaluna_0-1658175547769.png

hat natürlich dann gleich funktioniert...

🙂

VG Björn

View solution in original post

5 REPLIES 5
FreelanceReinh
Jade | Level 19

Hallo @lapaluna und herzlich willkommen in den SAS Support Communities*!

 

Wenn der vorhandene Datensatz ("HAVE") bereits geeignet sortiert ist, kann man die neue Spalte wie folgt erzeugen:

data want;
set have;
by year department product seller month;
if first.seller then Sum_cum=Sum;
else Sum_cum+Sum;
run;

Um HAVE nicht zu überschreiben, lege ich einen neuen Datensatz WANT an. Aus dem BY-Statement geht hervor, dass hier eine Sortierung von HAVE nach den genannten Variablen angenommen wird, also erst nach YEAR, innerhalb von YEAR nach Department, innerhalb von Department nach Product usw. Der gezeigte Screenshot passt zu dieser Annahme. Sollte eine andere Sortierreihenfolge vorliegen, wäre das BY-Statement anzupassen (oder HAVE erst zu sortieren).

 

Falls die Daten lediglich gruppiert sind (z. B. im Fall von drei Produkten "PID02", "PID01", "PID03" in Variable Product, aber der Rest unverändert), kann man im BY-Statement das Schlüsselwort NOTSORTED angeben. Der Nachteil ist, dass dann keine automatische Überprüfung der gewünschten Sortierung (z. B. der Monate!) mehr erfolgt, weil es sich auf alle Variablen bezieht.

 

Die IF-Bedingung first.seller ist jeweils für den ersten Satz einer Gruppe von aufeinanderfolgenden Sätzen zu demselben Verkäufer (innerhalb einer Wertekombination von YEAR, Department und Product) erfüllt. Das im ELSE-Statement verwendete Konstrukt mit dem Pluszeichen nennt sich Sum Statement und ist genau für solche kumulativen Additionen gedacht.

 

Wenn WANT nur die Sätze des Jahres 2022 aus HAVE enthalten soll, kann man nach dem SET-Statement ein entsprechendes WHERE-Statement einfügen.

 

* genauer gesagt: in deren englischsprachigem Bereich. Der für Fragen auf Deutsch heißt CoDe SAS German und ist auch sehr nett. :-)

lapaluna
Fluorite | Level 6

Hallo @FreelanceReinh ,

erst einmal vielen lieben Dank für die ausführliche Erklärung!

Ich habe es jetzt nun mehrere Male versucht und leider bekomme ich es nicht hin 🙂 und ich weiß nicht warum...

Im Folgenden drei Screenshots:

  1. Ausgangstabelle (bereits sortiert nach Year / Department / Product / Seller / Month)
  2. Das Skript
  3. Das Ergebnis

Problem:

Leider kumuliert er die Werte nicht, als ob der den Seller nicht eindeutig finden würde. Oder es fehlt im Skript noch der Verweis, dass er VSZIEL_cum aus dem Vormonat entnehmen muss. Oder ich mach einfach was falsch und merke es nicht 😛

 

1. Screenshot (hier habe ich schon im Vorfeld richtig sortiert und die Spalte VSZIEL_cum ist noch nicht befüllt)

lapaluna_0-1658170428884.png

2. Screenshot - das Skript:

lapaluna_1-1658170509112.png

3. Screenshot - er befüllt die Spalte VSZIEL_cum, aber diese entspricht immer dem Wert vom laufenden Monat, nicht kumuliert für den Seller in dem Jahr aus dem Vormonat.

Vielleicht noch einmal zu Verständlichkeit:
In Zeile 2 in der Spalte VSZIEL_CUM sollte das VSZIEL_CUM aus Zeile 1 mit dem VSZIEL aus Zeile 2 addiert werden (5.221.546,00 +3.118.255,23=8.339.801,23)

lapaluna_2-1658170645516.png

Sorry...dachte ich bekomme das so hin und bin für den finalen Tipp sehr dankbar.

VG Björn

FreelanceReinh
Jade | Level 19

Kein Problem. Das liegt daran, dass die eigentlich erst zu erstellende Variable VSZIEL_CUM bereits im Ausgangsdatensatz enthalten ist. Dadurch wird der kumulierte Wert immer wieder von dem bereits vorhandenen (0.00) überschrieben und das Kumulieren fängt in jeder Zeile wieder von vorn an.

 

Also einfach VSZIEL_CUM von vornherein weglassen, wenn WORK.QUERY_FOR_QUERY_KOM_STX_ZIELE erzeugt wird, oder per DROP=-Dataset-Option im vorhandenen SET-Statement temporär entfernen:

set WORK.QUERY_FOR_QUERY_KOM_STX_ZIELE(drop=VSZIEL_CUM);

 

lapaluna
Fluorite | Level 6

Vielen Dank @FreelanceReinh ,

lapaluna_0-1658175547769.png

hat natürlich dann gleich funktioniert...

🙂

VG Björn

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!

Mastering the WHERE Clause in PROC SQL

SAS' Charu Shankar shares her PROC SQL expertise by showing you how to master the WHERE clause using real winter weather data.

Find more tutorials on the SAS Users YouTube channel.

Discussion stats
  • 5 replies
  • 1463 views
  • 2 likes
  • 2 in conversation