2014-06-25 178 views
1

我对SQL相当缺乏经验,但我努力尝试将我的代码压缩到一个查询中,以便它更高效。下面是一个更复杂的问题,我有一个简单的例子。我在创建摘要组和变量的语法方面遇到问题。在我的情况下,数据存放在几个不同的表中,但连接对我来说不是问题,所以我只在这里创建了一个表。SQL创建新变量

这是我拥有的数据:

Name Class Wk Score ExCred X 
Joe A 1 35 ?  3 
Hal A 1 50 5  4 
Sal A 1 45 ?  3 
Kim B 1 30 5  6 
Cal B 1 40 ?  6 
Joe A 2 50 ?  2 
Hal A 2 40 ?  3 
Sal A 2 40 ?  4 
Kim B 2 40 5  5 
Cal B 2 40 ?  4 

我想创建看起来像这样的表:

Class Wk Avg_Score Sum_X 
A  1  45  10 
B  1  37.5  12 
A  2  43.3  9 
B  2  42.5  9 

因此,该数据是由类和周总结。 avg_score是每个学生总和的平均值,'score'和'ExCred'。 Sum_X只是每个类的X的总和。

我已经通过使用多个proc means语句在SAS SQL中取得了成功,但这很笨拙,似乎需要很长时间。必须有一个更优雅的方式来做到这一点。我知道这可能涉及集团的声明.....帮助?

谢谢。 Pyll

回答

2

我没有看到没有特别的理由不在这里使用proc means。它应该比在相当大的数据集上的proc sql快得多。

proc means data=have; 
class class wk; 
types class*wk; 
var score x; 
output out=want mean(score)= sum(x)=; 
run; 

只是预处理数据以将ExCred包括到Score变量中;如果执行时间有问题,请使用视图来执行此操作。

如果你确实想在sql中这样做,你确实会使用一个group。

proc sql; 
    create table want as 
    select class, wk, mean(score+ex_cred), sum(x) 
    from have 
    group by class, wk; 
quit; 
+0

由于我的数据是在多个表中,我不得不使用连接来创建一个表,比如在使用proc方法之前创建一个表,然后在之后实际加入更多的东西。这是一团糟。所以,现在我试图在SQL(而不是SAS SQL)中完成它。上面的代码没有将缺少的值作为零处理,这正是我想要的。 – pyll

+0

我想我用“zeroifnull”函数对它进行了排序。 – pyll