SAS中HAVING子句的汇总函数

时间:2013-05-07 16:29:05

标签: sas

我有以下查询,它返回客户的用户名,年份和半年,第一个半年的投注计数,第二个半年的投注计数和利润计算。

  

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;

退出;

如何将此限制在样本前半部分至少有4次下注的客户?如果我取消注释我在那里的HAVING子句,它似乎只返回前半部分的行,并且不返回后半行。我尝试将限制放入WHERE子句中,但显然您不能在该CLAUSE中放置摘要函数。

我该怎么做?

由于

2 个答案:

答案 0 :(得分:1)

您可以在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 ...)子查询来过滤给那些人;你不能只用分组和拥有它。

答案 1 :(得分:0)

我也有问题。在对正确的代码和我的代码进行详细比较之后,我发现问题出在group by,这只是字符变量。如果我们使用数字,那么错误就来了