【问题标题】:SQL Creating new variablesSQL 创建新变量
【发布时间】:2014-06-25 23:21:48
【问题描述】:

我对 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 mean 语句在 SAS SQL 中取得了成功,但这很笨拙,而且似乎需要很长时间。必须有一种更优雅的方式来做到这一点。我知道这可能涉及到 group by 声明.....帮助?

谢谢。皮尔

【问题讨论】:

    标签: sql sas


    【解决方案1】:

    我认为没有特别的理由不在这里使用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 by。

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

    【讨论】:

    • 由于我的数据在多个表中,我不得不在使用 proc 方法之前使用连接来创建一个表,例如上面的那个,然后在之后实际加入更多的东西。这是一团糟。所以,现在我正在尝试用 SQL(不是 SAS SQL)来做。上面的代码没有将缺失值处理为零,这正是我想要的。
    • 我想我用 'zeroifnull' 函数对其进行了排序。
    猜你喜欢
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 2018-06-05
    相关资源
    最近更新 更多