0

私は、ユニークな組み合わせで申請が提出された人のリストと回数をまとめようとしています。

テーブル A 構造は次のように設定されます。

     PERSON_ID CLAIM_ID   
     123456 A123C   
     123456 Z321C   
     123456 B123C   
     111111 A123C   
     111111 Z321C   

テーブル B の構造は次のように設定されます。

     PERSON_ID CLAIM_1 CLAIM_2 CLAIM_3   
     123456 A123C Z321C B123C   
     123456 A123C B123C   
     123456 B123C   
     111111 A123C Z321C   
     111111 A321C

私が生成する必要がある結果は次のようなものです。

     PERSON_ID CLAIM_ID NUM_TIMES_CLAIMED   
     123456 A123C 2   
     123456 Z321C 1   
     123456 B123C 3   
     111111 A123C 1   
     111111 Z321C 2   

開いているレコードセットでループを使用して MSAccess でこれを行うことができます。SAS レコードセットを開いてループ (マクロ) する方法を調査しようとしましたが、正しく実装する方法を整理できないようです。

何か案は?

編集
私が取らなければならないと思う手順は次のとおりです。

ステップ 1 - CLAIM_ID の 1 人の個別のリストを分離する
ステップ 2 - 各 CLAIM_ID について、25 の変数をスキャンして一致を見つける
ステップ 3 - 一致が見つかるたびにカウントする
ステップ 4 - 観察結果を保存する (PERSON_ID、CLAIM_ID、NUM_TIMES_CLAIMED)

VBA から SAS まで、表 B の 25 の変数のそれぞれをループしながら、1 人の個人の個別のクレーム リストを分離してループすることができないようです。

ある請求が別の請求で請求されているかどうかを評価するために使用するものは次のとおりです。これは、何らかの形で自動化する必要があると思います。

data LOCALPC.SEL_ASMT_DEL;
  SET LOCALPC.FY2014_CC_FINAL;
    ARRAY FSC{25} $ FSC1-FSC25;
    DO I = 1 TO 25;
        IF FIND (FSC{I},'A123A') THEN 
            DO N = I+11 TO 25;
                IF FIND (FSC{J},'Z321A') THEN
                    OUTPUT;
            END;
    END;
RUN;
4

2 に答える 2

0

すべてのクレームがテーブル A に行の形式で挿入され、person_id のクレームが重複していると仮定すると、「テーブル A」からだけで結果を取得できると思います。

SELECT  PERSON_ID, CLAIM_ID, COUNT(1)
FROM    [TABLE A] A
GROUP BY PERSON_ID, CLAIM_ID

そうでない場合は、テーブル構造とそれらの間の関係を説明してください。

于 2015-11-03T01:40:35.687 に答える
0

単純な結合に答えるためにループを使用する理由がわかりません。最初にテーブル B をより正規化された形式に変換すると、より簡単になります。

まず、サンプル データをデータセットに取得します。

data A ;
length PERSON_ID CLAIM_ID $10 ;
input PERSON_ID    CLAIM_ID   ;
cards;
123456       A123C   
123456       Z321C   
123456       B123C   
111111       A123C   
111111       Z321C   
;;;;
data B ;
length PERSON_ID CLAIM_1 - CLAIM_3 $10 ;
input PERSON_ID    CLAIM_1-CLAIM_3   ;
cards;
123456       A123C      Z321C      B123C   
123456       A123C      B123C   .
123456       B123C . .  
111111       A123C      Z321C   .
111111       A321C ..
;;;;

次に、テーブルを結合して、一致する行の数を数えます。

proc sql ;
  create table want as 
    select a.*,count(*) as num_times_claimed
    from a 
    left join b
    on a.person_id = b.person_id 
    and (a.claim_id = b.claim_1
      or a.claim_id = b.claim_2
      or a.claim_id = b.claim_3
         )
    group by 1,2
    order by 1,2
  ;
quit;
proc print; run;

結果:

   PERSON_
     ID       CLAIM_ID    num_times_claimed

   111111      A123C          1
   111111      Z321C          1
   123456      A123C          2
   123456      B123C          3
   123456      Z321C          1
于 2015-11-03T01:20:33.820 に答える