在子查询 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 编程,即可为您提供所需的百分比。
嗨,我有一个数据集看起来像这样
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 编程,即可为您提供所需的百分比。