2014-06-25 219 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