Join Now

SAS VA beregnet element: Concatenate og parameter

by Occasional Contributor Dan_yu_W on ‎10-27-2015 11:51 AM (325 Views)

Hej kære forum.

 

Ved konstruktion af et nyt beregnet element i SAS VA, er det så muligt at concatenate (felte to tekst-variabler til en) tekst og en paramterværdi?

 

Fx har jeg følgende formel for det beregnet element "Udmeldelse":

 

IF

(((Concatenate('Medlemsgruppe_', Format('Start_måned'p, 'BEST6.')) In ('X','Y'))

AND

((Concatenate('Medlemsgruppe_', Format('Slut_måned'p, 'BEST6.')) In ('Ikke medlem'))
RETURN 1
ELSE 0

 

Ideen er at summen af "Udmeldelse" skal være afhængige af hvilken start_måned og slut_måned, de to parameter er valgt til.

Mit problem lader dog til, at ved at bruge Concatenate, så kan VA ikke finde ud af at resultatet er et variabelnavn, og ikke bare en almindelig tekst-stykke.

Er der en funktion, hvor man kan "konvertere" et string-tekst til variabel?

 

Hilsen Dan

Comments
by SAS Employee Torben_Skov_SAS
on ‎10-30-2015 06:56 AM

Hej Dan,

Du har ret. Concatenate er en funktion til manipulation af strenge, så resultatet vil være en tekst og ikke et variabel navn.

Tilsvarende vil dine 'X'  og 'Y' jo blot være tekster og heller ikke variabel navne.

Hvis jeg forstår din problemstilling korrekt så har du et antal kolonner

medlemsgruppe_01, medlemsgruppe_02, medlemsgruppe_03, hvor i der står nogle tekster: X eller Y eller "ikke medlem" (og måske også andre værdier)

Du vil nu ud fra om der står "x","Y" og "ikke medlem" i bestemte kolonner lave en optælling.

Du er nød til at opbygge din logik lidt anderledes.

Du laver 2 beregnede kolonner jeg kalder dem test_start_md og test_slut_md. Du sender resultatet af dine medlemsgruppe_01 ....medlemsgruppe_nn over i disse testkolonner afhængig af parameterværdien, og  så laver du dit test på disse kolonner.

Første step er at lave test kolonnerne, her skal du bruge nested IF ELSE (sikkert mange af dem)

Her beregning af test_start_måned ud fra parameteren

IF ( 'Start_måned'p = 1 )
RETURN 'Medlemsgruppe_01'n
ELSE (
  IF ( 'Start_måned'p = 2 )
  RETURN 'Medlemsgruppe_02'n
  ELSE (
    IF ( 'Start_måned'p = 3 )
    RETURN 'Medlemsgruppe_03'n
    ELSE 'osv osv' ) )

Tilsvarende gør du for test_slut_måned

og så laver du din beregnede kolonne udmeldelse som

IF ( ( 'test_start_måned'n In ('X','Y') ) AND ( 'test_slut_måned'n In ('ikke medlem') ) )
RETURN 1
ELSE 0


Bemærk at dette nok ikke er vejen frem hvis du har rigtigt mange medlemsgruppe_xx kolonner.

by Occasional Contributor Dan_yu_W
on ‎11-04-2015 10:41 AM

Hej Torben.

 

Tak for svaret. 

Det grundlæggende problemstilling, er at jeg vil sammenligne et medlems medlemsstatus (gennem et ID variabel) over tid i databasen, fx hvor mange medlemmer, der i januar har medlemsstatus=1, og i fx oktober har medlemsstatus=2.

 

Data er lige nu sat op sådan at

kolonne 1=ID

kolonne 2=medlemsstatus_1.1.11

kolonne 3=medlemsstatus_1.2.11

osv.

kolonne x=medlemssattus_1.11.15

 

Flere kolonner tilføjes således i takt over tid.

 

Metoden med at lave 2 dummy_variabler, der henter data afhængigt af de to parameterværdier vil løse problemet, men så skal man ind i syntaksen, og tilføje en nested IF sætning hver gang, en ny måned kobles på. Det er også derfor jeg oprindelig havde tænkt på at gøre variabelnavnet direkte afhængigt af parameterværdien (som åbenbart ikke er muligt).

 

Jeg har et seperat datasæt, hvor nye måneder er koblet "lodret" på, dvs. ny måneder bliver bare appended på de tidligere måneder så jeg har følgende struktur:

 

kolonne 1=ID

kolonne 2=Medlemsstatus

kolonne 3=dato

 

Er det måske en nemmere datastruktur at arbejde med i denne sammenhæng?

 

Har tænkt i retning af:

start_dummy = IF (dato = 'start_måned'p)

                          RETURN ('Medlemsstatus'n)

                          ElSE "0"

slut_dummy = IF (dato = 'slut_måned'p)

                          RETURN ('Medlemsstatus'n)

                          ElSE "0"

 

Det virker ikke, da de overførte værdier [start_dummy, slut_summy] for fx ID = a placeres i to forskellige rækker, og man dermed ikke kan beregne en ny værdi på baggrund af start_dummy og slut_dummy.