Как создать новый столбец на основе условия другого столбца PROC SQL

#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;