不同组合的sas计数数

不同组合的sas计数数,sas,Sas,我有一个数据集,里面有一所学校的学生教育信息。 我想知道他们参加过多少不同的学习课程组合。我有硕士和学士学位的信息,我想统计每个教育级别(硕士、学士)的不同学习课程的数量 例如,person1可以有: Bachelor: - study1 - study2 - study3 - study3 Master: - studyA - studyA 然后我想要3个学士水平的学习课程(学习3不应该算两次),以及1个硕士水平的课程。 每个研究计划都有自己的行-因此在数据集中person1有6行。

我有一个数据集,里面有一所学校的学生教育信息。 我想知道他们参加过多少不同的学习课程组合。我有硕士和学士学位的信息,我想统计每个教育级别(硕士、学士)的不同学习课程的数量

例如,person1可以有:

Bachelor:
- study1
- study2 
- study3
- study3

Master:
- studyA
- studyA 
然后我想要3个学士水平的学习课程(学习3不应该算两次),以及1个硕士水平的课程。 每个研究计划都有自己的行-因此在数据集中person1有6行。 我想要每人一行,告诉每个教育水平的学习课程数量:

person   number_bachelor     number_master
person1  3                   1
....etc...
我试过这样做:

proc sql;
create table  new as
select  distinct personid, name, 
count(study) as number_of_bach
from old
group by personid, edu_level, study;
quit;
但它没有给我想要的。 这给了我两行person1,变量“number_of_bach”中的值为1和2

如何编辑此代码以获得所需的结果?

这是您想要的吗

DATA old; 
   INPUT personid edu_level $ study $;
   DATALINES; 
1 bachelor study1
1 bachelor study2
1 bachelor study3
1 bachelor study3
1 master studyA
1 master studyA
1 master studyB
; 

PROC SQL;
  CREATE TABLE new AS
  SELECT personid, edu_level, COUNT (DISTINCT study) AS num_bach
    FROM OLD
   GROUP BY personid, edu_level;
QUIT;
study
在查询中是一个所谓的聚合列(因为
COUNT
是一个聚合函数),因此不应包含在
groupby
-子句中(否则您的查询也将按“study”分组,并且计数将始终为1)

如果您想让一行中的每个人都有一个,则添加一个
PROC TRANSPOSE

PROC transpose IN = new OUT = new2;
  BY personid;
  ID edu_level;
RUN;
(您还可以使用子查询和联接而不是转置来创建更复杂的查询,只要您没有数百万行,
转置的开销无关紧要)

为了完整起见,这里是您问题的唯一SQL解决方案:

PROC SQL;
  CREATE TABLE new AS
  SELECT p.personid, b.num_bachelors, m.num_masters
            /* Select unique personids */
            FROM (SELECT DISTINCT personid 
                    FROM old) AS p
            /* Count number of bachelor-level courses */
            LEFT JOIN (SELECT personid, 
                              COUNT(DISTINCT study) AS num_bachelors 
                         FROM old WHERE edu_level = 'bachelor' 
                        GROUP BY personid) AS b on p.personid = b.personid
            /* Count number of master-level courses */
            LEFT JOIN (SELECT personid, 
                              COUNT(DISTINCT study) AS num_masters 
                         FROM old WHERE edu_level = 'master' 
                        GROUP BY personid) AS m on p.personid = m.personid;

QUIT;
代码:

工作:在这里,排序过程将消除重复记录(如果有)。然后SQL过程只能用于生成学士学位课程的个人计数以及硕士学位课程的计数

输出:

person   num_bachelors    num_masters
person1              3              1
person2              1              2

非常感谢你的帮助,这正是我想要的。
person   num_bachelors    num_masters
person1              3              1
person2              1              2