Суммировать и вычислять элементы конкретно в наборе данных с помощью proc sql

#sas

#sas

Вопрос:

Мой набор данных и попытка

 data mydata;
input Category $ Item $;
datalines;
A 1
A 1 
A 2
B 3
B 1
;

proc sql;
create table mytable as 
    select *, count(Category) as Total_No_in_Category, count(Category)-count(item, "3") as No_of_not_3_in_the_same_category from mydata
    group by Category;
run;
 

Результат

 Category     No_of_not_3_in_the_same_category   Total_No_in_Category


  A                      3                          3
  A                      3                          3
  A                      3                          3
  B                      2                          2
  B                      2                          1
 

Мой ожидаемый результат

  Category   No_of_not_3_in_the_same_ category   Total_No_in_Category
    A                          2                       3
    B                          1                       2
 

Интересно, как достичь ожидаемого результата, используя только proc SQL. Большое вам спасибо.

Ответ №1:

COUNT(item, "3") Вызов функции с двумя аргументами не является суммирующей функцией. Это приводит к автоматическому повторному объединению всех строк из исходной таблицы с совокупным вычислением ( count() thes ). Повторное объединение является частной функцией SAS Proc SQL , а не частью стандарта ANSI для SQL.

Похоже, вам нужно количество уникальных значений элементов, отличных от 3, поэтому вам понадобится

 COUNT(DISTINCT ...expression...)
 

в запросе. ...expression... Может быть case предложением, которое преобразуется item="3" в нулевое значение, не имея else части case предложения.

Пример:

 create table want as
select
  category
  , count(*) as freq
  , count(distinct case when item ne "3" then item end) as n_unq_item_not_3
  from mydata
  group by category
  ;