2015-09-29 3 views
0

Я не понимаю, как sas вычисляет значение для PATIENT, я искал всюду, но, похоже, нет документации для того, как sas, вычисляет формулы в скобках case, Я знаю только, что когда значение PATIENT равно даже выражение CASE имеет логический результат 1, 0 или 2, но я просто не вижу, как получить значение из выражения, может ли кто-нибудь объяснить мне?как sas вычисляет значение case case

PROC SQL; 
CREATE TABLE TESTMED AS 
SELECT PATIENT, 
CASE ((PATIENT/2 = INT(PATIENT/2)) + 
(PATIENT = .)) 
WHEN 1 THEN 'Med A' WHEN 0 THEN 
'Med B' ELSE 'Error' END AS DOSEGRP 
LENGTH=5 
FROM VITALS 
ORDER BY PATIENT; 
QUIT; 
+0

Я думаю, что вы должны иметь ошибку MySQL из этой части ''!? - И в MySQL '(1 = 1)' равно '1';). –

+0

не могли бы вы предоставить нам некоторые пациенты? Я не вижу ошибки в этом коде. – stat

ответ

0

Я не вижу ошибок.

если пациент может быть. 0 1 2 это будет (первое выражение + второе выражение):

0 ---> {0=0}true(1) + {patient=.} false(0) = 1 
1 ---> {0.5=0}false(0) + {patient=.} false(0) = 0 
2 ---> {1=1}true(1) +{patient=.} false(0) = 1 
. ---> {.=.} true(1) + {patient=.} true(1) = 2 

Если вы хотите, чтобы увидеть результат этого логического выражения вы можете просто использовать:

PROC SQL; 
CREATE TABLE TESTMED AS 
SELECT patient, 
    ((PATIENT/2 = INT(PATIENT/2)) + (PATIENT = .)) AS result 
LENGTH=5 
FROM VITALS 
ORDER BY PATIENT; 
QUIT; 

, и вы увидите, что результаты верны. Так что ваше логическое выражение может принимать только 3 значения:

(1=0+1) 
(0=0+0) 
(2=1+1) 

When 0 you assign MEDA; 
When 1 you assign MEDB; 
When 2 you assign ERROR; 

И ОШИБОК назначается для недостающих значений.

1st expression: 
{missing/2=missing} = {int(missing)=missing} [errors are reported as missing] 
missing=missing ---> true ---> 1 

2nd expression: 
missing=missing ---> true ---> 1 

result: 
1+1=2 ---> ERROR 
0

SAS оценивает булевые выражения на 1 (true) или 0 (false). Таким образом, ваши выражения представляют собой сумму двух из них. Таким образом, возможные ответы: 0, 1 или 2.

Первое выражение, (PATIENT/2 = INT(PATIENT/2)), будет истинным, если ПАЦИЕНТ является четным или отсутствует. Второе выражение, (PATIENT = .), будет истинным, если отсутствует ПАЦИЕНТ. Таким образом, результат 2 означает, что ПАЦИЕНТ отсутствует в результате 1 означает, что ПАЦИЕНТ является четным, а результат 0 означает, что пациент странный.

Таким образом, вы можете переписать дела заявления, как: (. ПАЦИЕНТ =)

CASE WHEN MISSING(PATIENT) then 'Error' 
    WHEN MOD(PATIENT,2)=1 then 'Med A' 
    ELSE 'Med B' 
END AS DOSEGRP 
Смежные вопросы