2016-05-31 16 views
1

初めてSASコードを調べるSQL開発者として、私は提供されたスクリプトのセクションを理解するのに苦労しています。SASからSQLへの変換

誰でも次のことを説明できますか、可能であれば、SQLに相当するものを説明できますか?

* sum up the total 6 months value for customers with positive value and quantity of items; 

proc summary data=value_last6_positive nway missing; 
    var saleprice quantity; 
    class Cardid ; 
     output out = value_last6_s (drop=_type_ _freq_) 
      sum(saleprice)=saleprice 
      sum(quantity)=quantity; 
    run; 

* rank them; 

proc sort data=value_last6_s; 
    by saleprice; 
    run; 

data count; 
    set value_last6_s; 
    count=1; 
    run; 

proc sort data=count; 
    by count; 
    run; 

data count2; 
    set count; 
    by count; 
    if first.count then rank=1; 
    else rank+1; 

    if rank=<544139 then decile=10; 
    else if rank=<544139*2 then decile=9; 
    else if rank=<544139*3 then decile=8; 
    else if rank=<544139*4 then decile=7; 
    else if rank=<544139*5 then decile=6; 
    else if rank=<544139*6 then decile=5; 
    else if rank=<544139*7 then decile=4; 
    else if rank=<544139*8 then decile=3; 
    else if rank=<544139*9 then decile=2; 
    else decile=1; 

run; 

proc freq data=count2; 
    table decile; 
    run; 

proc means data=count2; 
var saleprice; 
    class decile; 
    run; 

私は限りCardIDでグループ化された売上データの集計を使用して構造(CardID, SalePrice, Quantity)を持ってvalue_last6_sの一時テーブルと同等の構築として持っています。どのように進めるかわからない。前もって感謝します。

編集:最初のproc summaryブロックの

マイ変換:

-- value_last6_s 
SELECT CardID, 
     SUM(SalePrice) SalePrice, 
     SUM(Quantity) Quantity 
INTO #value_last6_s 
FROM #value_last6_positive 
GROUP BY CardID 
ORDER BY SUM(SalePrice); 
+0

私は確認することはできませんが、私はそれが正の値とアイテムの数量... – RQDQ

+0

@RQDQのおかげで、非常に有用との顧客のための総6ヶ月の値を合計すると思います。 –

+0

申し訳ありません - 私は抵抗できませんでした。 :-)あなたはこれまでにどのようなSQLを開発しましたか? – RQDQ

答えて

0

最初のステップはちょうどサマリー表を作成しています。ダミー変数COUNTは定数として追加されますが、これはおそらく必要ありません。並べ替えは、RANK変数を次のステップで作成できるように、合計またはSALEPRICEの順に値を取得するために必要です。

create table COUNT as 
    select Cardid 
     , sum(saleprice) as saleprice 
     , sum(quantity) as quantity 
    from value_last6_positive 
    group by Cardid 
; 

次のデータステップでRANK変数が生成されています。ウィンドウ関数を含んでいないので、PROC SQLでそれを行うことはできません。これを行うにはROW_NUMBER()関数を使用できるはずです。 IF/THEN/ELSEチェインをCASE文で置き換えることができます。

create table COUNT2 as 
select a.* 
     , row_number() over (order by saleprice) as RANK 
     , case 
     when (rank<=544139) then 10 
     when (rand<=544139*2) then 9 
     ... 
     else 1 end as DECILE 
    from COUNT a 
; 

最後の手順では、新しいDECILE変数を使用してレポートを作成しています。

したがって、頻度レポート。

select decile,count(*) as COUNT,COUNT/(count(*) over()) as PERCENT 
    from count2 
    group by 1 
    order by 1 
; 

そして手段の要約。

select decile 
    , count(saleprice) as N 
    , mean(saleprice) as Mean 
    , min(saleprice) as Min 
    , max(saleprice) as Max 
from count2 
group by 1 
order by 1 
; 
+0

ありがとうございますが、私の変換と同じですが、 '1'定数の列が追加されたのはあなたの提案された改善ではありませんか?私は一時テーブルにダンプしているので、スクリプトの各セクションを段階的に壊すことができます。私は本当にこのビットに問題はありません。それは後で、私が理解していない不変の解釈の不変なものです。 –

+0

どのようなSQLのフレーバーを使用しますか?ランクを計算するためにデータステップが使用するsumステートメントを置き換えるために使用できるRANK()またはROW_NUMBER()関数がありますか? – Tom

+0

T-SQL、そうです - 'RANK()OVER ...' –

関連する問題