2015-04-04 3 views
1
proc SQL; 


CREATE TABLE DATA.DUMMY AS 
SELECT *, 
    CASE 
    WHEN (Discount IS NOT NULL) 
    THEN (Total_Retail_Price - (Total_Retail_Price * Discount)) * Quantity AS Rev 
    ELSE (Total_Retail_Price * Quantity) AS Rev 
    END 

FROM DATA.Cumulative_Profit_2013 AS P 

; 

Я пытаюсь включить потенциально столбцы NULL как часть выражения для Дохода. Но мое заявление о делах вызывает проблемы. Я проверил другие примеры, но я не могу видеть, почему это поможетSQL Case Statement Столбец NULL

ответ

4

Похоже, что вы можете использовать COALESCE для достижения своей цели без явного условно:

SELECT *, 
    (Total_Retail_Price - (Total_Retail_Price * COALESCE(Discount, 0))) * Quantity AS Rev 
FROM DATA.Cumulative_Profit_2013 AS P 
+0

Будьте осторожны Скидка (Скидка, 0) –

3

Не зная SAS обычного синтаксиса SQL будет:

SELECT *, 
    CASE 
    WHEN (Discount IS NOT NULL) 
    THEN (Total_Retail_Price - (Total_Retail_Price * Discount)) * Quantity 
    ELSE (Total_Retail_Price * Quantity) 
    END AS Rev 

То есть, с псевдонимом столбца после окончания выражение случая.

+0

Ну, теперь я чувствую себя глупо! Спасибо, что сделал трюк. – Jack

+0

Вы также можете добавить 'COALESCE' перед' CASE', чтобы избежать каких-либо полей 'NULL' в столбце Rev, если это то, что вы ищете. Что-то вроде этого 'COALESCE (CASE WHEN ....... END, 0) AS Rev'. – CrApHeR

+1

@CrApHeR Действительно, хороший момент. Другой ответ демонстрирует использование coalesce, хотя я не буду добавлять его в свою. – jpw

1

Как примечание, я хотел бы написать это как:

SELECT p.*, 
     (Total_Retail_Price * (1 - COALESCE(Discount, 0)) * Quantity) AS Rev 
FROM DATA.Cumulative_Profit_2013 AP 

Я нахожу повторение Total_Retail_Price в оригинальном выражении труднее следовать.

Примечание: все ответы работают в SAS.