1

私は4つのフィールドを持つテーブルを持っています。ID、ドル、インジケーター、およびタイプ。

ID | Dollar |   Indicator | Type

1  |    30  |   1         | A

1  |    20  |   1         | A

1  |    60  |   0         | A

1  |    34  |   1         | B

1  |    23  |   0         | B

1  |    45  |   0         | B

2  |    20  |   1         | A

2  |    20  |   0         | A

ここで、インジケーターが 1 であるすべてのドルを追加し、各 ID のインジケーター 0 を持つドルでそれらを減算します。また、場合によっては、タイプ別にグループ化する必要もあります。

次のコードを使用しましたが、適切な答えが得られないようです。

proc sql;
  select ID,Type,
  case when Indicator = '1' then sum(Dollar) else 0 end as Credit,
  case when Indicator = '0' then sum(Dollar) else 0 end as Debit
  from test
  group by ID,Type
  ;
quit;

proc sql;
  select ID,Type, (Credit - Debit) as Trans
  from test
  group by Id, Type
  ;
quit;
4

2 に答える 2

2

以下のコードは仕事をするはずです。変数を合計する必要がありますが、正味の数値のみが必要な場合は、最初の 2 つの case ステートメントをダンプできます。また、dollar8 形式を使用すると、出力の外観が向上します。

proc sql ;
  create table output as
  select id, type,
  sum(case when Indicator = '1' then Dollar else 0 end) as Credit format dollar8.,
  sum(case when Indicator = '0' then Dollar else 0 end) as Debit format dollar8.,
  sum(case when Indicator = '1' then Dollar else -1*Dollar end) as Trans format dollar8.
  from Test
  group by 1, 2
  ;
quit ;
于 2014-09-09T09:18:04.493 に答える
2

これはSASとタグ付けされているため、これが役立つかどうかはわかりません.

ただし、SQL では、case ステートメントで SUM を使用する必要があります。その逆ではありません。

select 
   ID,
   Type,
   sum(case when Indicator = '1' then Dollar else 0 end) as Credit,
   sum(case when Indicator = '0' then Dollar else 0 end) as Debit
from
   test
group by 
   ID,
   Type
;

その後、2 回目の操作を行います。

ただし、これはすべて単一の SQL ステートメントで実行できます。

select 
   id, 
   type, 
   sum(case indicator when 1 then dollar else -1*dollar end) as net_dollar
from
   temp
group by 
   id,
   type

ここのCASEステートメントは、借方取引のドル金額の符号を変更するだけなので、1 つのステップですべてを合計できます。

于 2014-09-09T00:09:05.140 に答える