1

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

过程 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 中放置摘要函数。

我该怎么做?

谢谢

4

2 回答 2

2

您可以在 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 (选择...)子查询以过滤到这些人;你不能仅仅通过分组和拥有来做到这一点。

于 2013-05-07T16:39:05.577 回答
0

我也有这个问题。经过详细对比正确的代码和我的代码,我发现问题是group by,它只是字符变量。如果我们使用数字,那么错误来了

于 2019-02-18T07:06:43.123 回答