2013-05-07 248 views
0

我有以下查詢,它返回客戶的用戶名,年份和半年,第一個半年的投注計數,第二個半年的投注計數和利潤計算。SAS中的HAVING子句中的彙總函數

proc sql;

create table avg 
    as 
    select 
    username as username, 
    year(datepart(betdate))*10 + floor((qtr(datepart(betdate))+1)/2) as yearsemiyear, 
    count(bet_id) as betcount, 

    sum(case when floor((qtr(datepart(betdate))+1)/2) = 1 then 1 else 0 end) as firstHalfBetcount, 
    sum(case when floor((qtr(datepart(betdate))+1)/2) = 2 then 1 else 0 end) as secondHalfBetcount, 

    round(mean((winnings - stake)/stake) * 100, 0.01) as averageMargin 

    from &dsn 
    WHERE datepart(BETDATE) > '31DEC2010'd AND datepart(BETDATE) <'01JAN2012'd 
    AND bet_type = 'SGL' 
    group by 1,2 
/* HAVING sum(case when floor((qtr(datepart(betdate))+1)/2) = 1 then 1 else 0 end) >= 4 */ 
    order by username desc, yearsemiyear asc; 

quit;

我該如何限制這種情況給在樣本前半段至少有4次投注的客戶?如果我取消註釋HAVING子句,那麼它似乎只返回前半部分的行,並且不返回後半部分行。我試圖把限制放在WHERE子句中,但顯然你不能在這個CLAUSE中放置一個彙總函數。

我該怎麼做?

謝謝

+2

僅供參考,在將來我會建議創建一個簡單的數據集,您可以將這些數據集作爲datalines包含在這些文章中,以便更容易地向您展示有用的示例,而不必單獨提供示例數據來解決您的問題:) – Joe 2013-05-07 16:39:22

回答

0

您可以引用HAVING子句中的計算列。例如見:

proc sql; 
select country, sum(case when region='EAST' then Actual else 0 end) as east_act, 
sum(case when region='WEST' then Actual else 0 end) as west_act 
from sashelp.prdsale 
group by 1 
having east_act > 120000; 
quit; 

具體到你的問題,你應該將HAVING子句改爲

HAVING firstHalfBetcount ge 4 

我又在看這個,不過,我覺得你的問題是,你分組半年 - 所以你不會得到下半年的記錄,因爲你從來沒有一個記錄同時具有上半年和下半年的數據(如果你的數據是我認爲的)。你要麼不需要半年的時間分組,要麼在整年的時間內完成這個任務,要麼不分開前半部分和後半部分。

如果您的目標是爲兩個行獲取行,但只包含具有4個前半部分投注的人的行,則可能需要創建此表,然後將其加入至少有4個前半部分投注的人的查詢中,或者使用where(select ...)子查詢來篩選這些人;你不能只通過分組和擁有。

+0

沒問題。未來將在頂部包含一些數據。 – user2146441 2013-05-07 16:40:45

+0

我在上面的代碼中總結了一個條件來計算firstHalfBetcount和secondHalfBetcount,因爲它們是使用sum()函數計算的。是否可以用mean()做同樣的事情,即對於下面一行'平均(((贏利 - 股權)/股權)* 100,0.01)作爲averageMargin'。這可以包圍一個案件/何時爲每個半年分開保證金? – user2146441 2013-05-07 16:46:11

+0

我不明白爲什麼不。 – Joe 2013-05-07 16:48:21