文字列が8バイト以上ある変数でTRANSPOSEプロシジャを利用する

[OS]ALL
[リリース] 6.12, 8.1, 8.2
[キーワード] TRANSPOSE, ID, IDLABEL, VARIABLE

[質問]

1レコードが複数行にまたがるデータを入力し、TRANSPOSEプロシジャを利用して1行ずつのレコードにまとめる事を考えています。しかし、転置のキーとなる変数が8バイトより長く、8バイト以下の長さでは値が重複してしまい、うまく転置がされません。また、該当する変数をLABELとして設定したいのですが、8文字で切られているために思うような結果になりません。何か回避方法はありますでしょうか。

データの例:

aaaaaaaaa 02/02/27 koumoku9  09123456789
aaaaaaaaa 02/02/27 koumoku10 10123456789
aaaaaaaaa 02/02/27 koumoku11 11123456789
bbbbbbbbb 02/02/27 koumoku9  09234567890
TRANSPOSE後のイメージ:
INPUT_DATA_GRP DATE      koumoku9      koumoku10    koumoku11
aaaaaaaaa      02/02/27  09123456789  10123456789  11123456789
bbbbbbbbb      02/02/27  09234567890  

[回答]

SAS System 6では、変数名の長さは8バイトまでの制約があります。そのため、質問のようにSAS System 6のTRANSPOSEプロシジャにおいても、IDおよびIDLABELに指定可能な変数は8文字までとなっています。ただし、設定したい変数をいったんユニークな8文字以内の別の変数に保管し、その変数をIDとして使用することにより、同等の機能を実現できます。
なお、SAS System 8からは、変数名が32バイトまで、変数ラベルは256バイトまでに拡張されており、制約が大幅に緩和されています。下記のサンプルプログラムをご覧ください。

/* TESTデータ作成 */
DATA testtr;
  LABEL a = 'input_data_grp'
        b = 'input_data_date'
        c = 'input_data_koumoku'
        d = 'input_data_count' ;
  FORMAT a $9. b yymmdd8. c $9. d $12. ;
  INPUT @1 a $9. @11 b yymmdd8. @20 c $9. @30 d 12. ;
DATALINES;
aaaaaaaaa 02/02/27 koumoku9  09123456789
aaaaaaaaa 02/02/27 koumoku10 10123456789
aaaaaaaaa 02/02/27 koumoku11 11123456789
bbbbbbbbb 02/02/27 koumoku9  09234567890
;
RUN;

/* ユニークな8バイト以内の別変数を作成 */
DATA testtr1;
  SET testtr;
  e = COMPRESS(SUBSTR(c,1,3)||SUBSTR(c,6,4)) ;
RUN;

/* IDへユニークな別変数を指定 */
PROC TRANSPOSE DATA=testtr1 OUT=trans1(DROP=_name_) ;
  BY  a b ;
  ID  e ;
  IDLABEL c ;
  VAR d ;
RUN;