Hallo Alostcause,
ich würde SQL verwenden. Da kann man gleichzeitig die Selektionen der Datensätze vornehmen und aggregieren. Mir ist noch nicht klar, was Du mit "Monaten" meinst. Am Beispiel 15.01 - 14.02
Ist das 1 Monat?
Sind das 2. Monate (Januar und Februar)?
ist das kein Monat (weder ein voller Januar noch ein voller Februar)?
Gegebenenfalls muss man die Monatsberechnung und Selektion noch anpassen.
data daten;
versicherter = 12345; leistung = 'a'; start = '15Jan2016'd; ende = '17Aug2016'd; betrag = 400; output;
versicherter = 12345; leistung = 'a'; start = '01Oct2016'd; ende = '31Dec2016'd; betrag = 200; output;
versicherter = 12345; leistung = 'b'; start = '01Feb2016'd; ende = '14Jun2016'd; betrag = 150; output;
versicherter = 11111; leistung = 'a'; start = '01Jan2016'd; ende = '17Nov2016'd; betrag = 500; output;
versicherter = 11111; leistung = 'b'; start = '16Jul2016'd; ende = '31Aug2016'd; betrag = 55; output;
format start ende eurdfdd10.;
run;
Proc sql;
Create table Erg2 as
select versicherter
, Leistung
, sum (intck('month',start,ende)) as monate
from Daten
group by versicherter
, leistung
;
Create table Erg1 as
select versicherter
, sum (monate) as monate
from Erg2
group by versicherter
;
Create table Erg4 as
select Coalesce(t1.versicherter, t2.versicherter) as versicherter
, t1.leistung as leistung1
, t2.leistung as leistung2
, sum (intck('month',Max(t1.start, t2.start),Min(t1.ende, t2.ende))) as monate
from Daten as t1, Daten as t2
where t1.versicherter = t2.versicherter
and t1.leistung < t2.leistung
and (t1.start < t2.ende and t1.ende > t2.start) /* Edit: Fehlerkorrektur */
group by calculated versicherter
, t1.leistung
, t2.leistung
;
Create table Erg3 as
select leistung1
, leistung2
, sum (monate) as monate
from erg4
group by leistung1
, leistung2
;
quit;
Viele Grüße
Jan
... View more