2017-03-03 7 views
1

数百万行のデータセットが2つあります。表1には、ID1とID2という2つの異なるID番号が含まれています。また、特定のIDが属するグループ(変数y1)を説明する変数も含まれています。Proc sql - メインクエリのサブクエリからの集計関数によるグループ化

第2のテーブル(表2)には、第1のテーブルの2つの変数と、追加の1つの変数が含まれています。

2つのテーブルを一緒に結合したいが、結合の前に、table1にID1でグループ化された情報だけが含まれていて、IDが属するグループの情報が表示されるようにしたい。

2つのProc SQLステージでこれを行うことができます。ここでは、まずID1でグループ化したtable1にテーブルを作成し、次にtable2にマージする別のステップを作成します。しかし、これは私のテーブルには非常に多くの行が含まれているため、1回の実行でそれをやりたいのではなく、むしろ非効率です。したがって私は代わりに私が望むことをするサブクエリを作成しました。私の問題は、サブクエリの変数 "WhichGroup"でグループ化できないというエラーが集合関数から生じるためです。私は達成したいものにいくつかの良い解決策があるのだろうかと思っています。

事前に感謝します。

例コード:

data table1; 
input ID1 $ ID2 $ x1 2. y1 $; 
datalines; 
1 p1 10 Group1 
1 p2 20 Group2 
2 p3 50 Group1 
; 
run; 

data table2; 
input ID1 $ x1 x2; 
datalines; 
1 10 500 
1 20 600 
2 50 700 
; 
run; 


Proc sql; 
    Create table Test 
     as select 
     t1.WhichGroup 
     ,sum(t1.Sum_x1) as Sum_x1 
     ,sum(t2.x2) as Sum_x2 
      from (select 
        a.ID1 
        ,case when max(case when a.y1 = 'Group1' then 1 else 0 end) = 0 then 'Group2' 
          when max(case when a.y1 = 'Group2' then 1 else 0 end) = 0 then 'Group1' 
          else 'Both' end as WhichGroup 
        ,Sum(a.x1) as Sum_x1 
        from work.table1 as a 
       group by 1 
       ) as t1 
      left join 
       work.table2 as t2 
     on t1.ID1 = t2.ID1 
    Group by 1; 
Quit; 

答えて

0

- 私はなぜこれが起こっているかわからないが、私は非常に興味現象とSASにおける潜在的にバグに遭遇した

- 自分の質問に答えます。

クエリが機能しない全理由は、グループ化する変数名を明示的に記述するのではなく、数字で指定するとSASがグループ文を理解しないためです。潜在的にSASは列順に失われますか?

SASでこれまでに他の誰かがこのような現象に遭遇しましたか?

次のコードが使用される場合したがって、クエリが機能:

Proc sql; 
    Create table Test 
     as select 
     t1.WhichGroup 
     ,sum(t1.Sum_x1) as sum_x1 
     ,sum(t2.x2) as Sum_x2 
      from (select 
        a.ID1 
        ,case when max(case when a.y1 = 'Group1' then 1 else 0 end) = 0 then 'Group2' 
          when max(case when a.y1 = 'Group2' then 1 else 0 end) = 0 then 'Group1' 
          else 'Both' end as WhichGroup 
        ,Sum(a.x1) as Sum_x1 
        from work.table1 as a 
       group by 1 
       ) as t1 
      left join 
       work.table2 as t2 
     on t1.ID1 = t2.ID1 
    Group by WhichGroup; 
Quit; 
関連する問題