#sql #sas
#sql #sas
Вопрос:
Я пытаюсь создать набор новых столбцов на основе условия другого столбца, используя инструкцию sql в SAS. Однако в моем текущем коде всякий раз, когда условие не выполняется, оно отображается как нулевое значение. Но я не хочу, чтобы новые столбцы создавались с этими пробелами. Может кто-нибудь помочь с этим? В фактическом наборе данных я объединяю несколько таблиц вместе.
Вот упрощенный макет набора данных:
Вот используемый код:
PROC SQL;
Create table Sales AS
SELECT
SUM (CASE WHEN Sub_Category in('Coffee')THEN Previous_Sales END)AS
Coffee_Sale,
SUM(CASE WHEN Sub_Category in('Tea')THEN Previous_Sales END)AS Tea_Sale,
SUM(CASE WHEN Sub_Category in('Soda')THEN Previous_Sales END)AS Soda_Sale
FROM data
GROUP BY Sub_Category;
И я пытаюсь перейти к этому формату:
Этот код возвращает:
Комментарии:
1. Почему SQL? Почему бы не использовать обычный код SAS?
Ответ №1:
Вам просто нужно удалить group by
из существующего кода.
Create table Sales AS
SELECT SUM (CASE WHEN Sub_Category in('Coffee')THEN Previous_Sales END)AS Coffee_Sale,
SUM(CASE WHEN Sub_Category in('Tea')THEN Previous_Sales END)AS Tea_Sale,
SUM(CASE WHEN Sub_Category in('Soda')THEN Previous_Sales END)AS Soda_Sale
FROM data -- no group by
Вы можете добавить то же SUM
самое с case
выражением для пива и воды.
Ответ №2:
Использование PIVOT, более подробно в этом документе от Oracle.
SELECT * FROM
(SELECT Previous_Sales, Sub_Category
FROM data)
PIVOT (
SUM(Previous_Sales),
FOR Sub_Category IN ('Coffee', 'Tea', 'Soda')
)
Комментарии:
1. Не уверен, как синтаксис ORACLE помогает для вопроса SAS. Похоже, что они не используют какой-либо переход к Oracle или любому другому языку запросов, отличному от SAS.
Ответ №3:
Я бы не стал использовать SQL для этой проблемы, потому что вам нужно будет жестко указать значения и имена переменных (или использовать некоторую генерацию кода). Если вместо этого вы просто используете стандартные процедуры SAS, ваш код автоматически адаптируется к новым подкатегориям.
proc summary data=have nway ;
class sub_category ;
var previous_sales ;
output out=stats sum= ;
run;
proc transpose data=stats out=want(drop=_name_) suffix=_sales;
id sub_category;
var previous_sales;
run;