1

顧客のユーザー名、年と半年、最初の半年の賭けの数、2 番目の半年の賭けの数、および利益計算を返す次のクエリがあります。

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に集計関数を入れることはできないようです。

どうすればいいですか?

ありがとう

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 を使用する必要があります。 (select... ) それらの人々に絞り込むためのサブクエリ。グループ化して持つだけではできません。

于 2013-05-07T16:39:05.577 に答える