【问题标题】:Group by in Subquery SAS在子查询 SAS 中分组
【发布时间】:2015-10-10 19:50:18
【问题描述】:

您好,我有一个如下所示的数据集

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.

请帮忙。非常感谢!

【问题讨论】:

  • 你为什么不使用 PROC FREQ?
  • 感谢您的回复。因为它会给出现在类别 1 和类别 2 中的品牌 A 带来问题。我使用 sql 因为它更容易计算市场集中度指数,它等于 (a 的百分比) ^2 + (b 的百分比) ^2 + (百分比c) ^2 .

标签: sql group-by sas subquery


【解决方案1】:

您需要将类别总数重新合并到品牌*类别组合中。如果您愿意,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
 ;

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

【讨论】:

    【解决方案2】:
    select count(category) from dataset group by category
    

    此子查询返回多于 1 行。它返回每个类别的计数。但是您想要特定类别的计数,因此将其替换为

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

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

    这是使用派生表的另一种方式,其中一个派生表包含每个品牌/类别的计数,第二个表包含每个类别的总计数。

    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
    

    【讨论】:

      【解决方案3】:

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

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

      这应该可以为您提供所需的 %,而无需复杂的 sql 编程。

      【讨论】:

        猜你喜欢
        • 2015-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多