2015年8月27日木曜日

SQLプロシジャのDISTINCTを使ったグループ毎のカウント。




SQLプロシジャのDISTINCTについては、「有害事象の発現例数と件数を簡単に出す。」で紹介済みですが、まだまだ魅力が伝わりきってないので再度紹介したいと思います。



サンプルデータ

data DT1;
input CUST_ID$ NAME$ FOOD$;
cards;
001 James BREAD
001 James CANDY
002 Alice BREAD
002 Alice CANDY
002 Alice CANDY
;

 CUST_ID 
 NAME 
 FOOD 
 001
 James
 BREAD 
 001
 James
 CANDY
 002
 Alice
 BREAD
 002
 Alice
 CANDY
 002
 Alice
 CANDY


サンプルは、顧客ID(CUST_ID)で管理されたお客さん(NAME)が購入した食べ物(FOOD)を記録したデータだとします。



やりたい事

このデータから、以下の集計をしたい。
↓↓食べ物(FOOD)毎の「購入者数(C1)」と「購入者の全購入数(C2)」

 FOOD 
 C1 
 C2 
 BREAD 
  
  2
 CANDY
  2
  3



こういった集計は、SQLのDISTINCTを使えば一発です。

proc sql;
  create table OUT1 as
  select  FOOD,
             count( distinct CUST_ID ) as C1,
             count( CUST_ID ) as C2
  from DT1
  group by FOOD;
quit;



簡単に解説

  • SQLのCOUNT関数: 引数が非欠損値のレコード数を求める
  • DISTINCT: 関数の中に指定すると、引数の値から重複を除いたレコードを計算対象とする


つまり、食べ物(FOOD)毎に以下を求めています。
  • count( distinct CUST_ID ): CUST_IDの値から重複を除いた非欠損値の数 = 購入者の人数
  • count( CUST_ID ): CUST_IDが非欠損値の数 = 購入者の全購入数


0 件のコメント:

コメントを投稿