在子查询 SAS 中分组

Group by in Subquery SAS

嗨,我有一个数据集看起来像这样

Brand   Category
----------------------
A       1
A       1
A       1
B       1
B       1
C       1
A       2
C       2
C       2
C       2

并且我想获得每个品牌在每个类别中的市场份额。假设 A 在类别 1 中的市场份额为 3/6=50%。

我使用了sql代码

    proc sql;
    select
    Brand, 
    count(brand) / (select count(category) from dataset group by category) as percent
    from dataset
    group by brand, category;

但是SAS报错

 ERROR: Subquery evaluated to more than one row.

请帮忙。非常感谢!

select count(category) from dataset group by category

此子查询 returns 多于 1 行。它 returns 每个类别的计数。但是你想要特定类别的计数,所以将其替换为

select count(category) from dataset where category = d.category

并确保给 dataset 一个别名,即 from dataset d

这是使用派生 table 的另一种方法,其中一个派生 table 包含每个 brand/category 的计数,第二个 table 包含每个类别的总计数。

select cnt/total, t1.brand, t1.category 
from (
    select count(*) cnt, brand , category
    from dataset 
    group by brand, category
) t1 join (
   select count(*) total, category
   from dataset 
   group category
) t2 on t2.category = t1.category

您需要将类别总计数合并回品牌*类别组合。如果您愿意,PROC SQL 会自动为您完成。

data have ;
  input Brand $ Category $ @@;
cards;
A 1 A 1 A 1 B 1 B 1 C 1 A 2 C 2 C 2 C 2
;

proc sql;
  select brand
       , category
       , nobs
       , sum(nobs) as cat_total
       , nobs/calculated cat_total as percent
   from (select category,brand,count(*) as nobs 
         from have 
         group by 1,2
        )
   group by category
   order by 1,2
 ;

注意:查询需要将汇总统计重新合并回原始数据。

我会像 Tom 提到的那样使用 proc freq。

proc freq data = yourdata;
table brand*category/missprint list;
run;

无需复杂的 sql 编程,即可为您提供所需的百分比。