TABULATEプロシジャで、存在しないCLASS変数の値を表に含める

[OS]ALL
[リリース] 8.1, 8.2
[キーワード] TABULATE, CLASSDATA

[質問]

TABULATEプロシジャで多次元の表を作成するとき、存在しないクラス変数の値を表に含めることはできますか?
下の例で、表1の「SHOP=東京2」の表に「CODE=S02」の行と「DATE=2001-01-02」の列を追加して、表2のような出力にしたいと思います。

表1

shop 東京1
 ----------------------------------------------------------------
 |                                        |        date         |
 |                                        |---------------------|
 |                                        | 01-01-01 | 01-01-02 |
 |                                        |----------+----------|
 |                                        |   数量   |   数量   |
 |----------------------------------------+----------+----------|
 |code                                    |          |          |
 |----------------------------------------|          |          |
 |S01                                     |         3|         1|
 |----------------------------------------+----------+----------|
 |S02                                     |         1|         1|
 |----------------------------------------+----------+----------|
 |S03                                     |         2|         1|
 ----------------------------------------------------------------


shop 東京2
 -----------------------------------------------------
 |                                        |   date   |
 |                                        |----------|
 |                                        | 01-01-01 |
 |                                        |----------|
 |                                        |   数量   |
 |----------------------------------------+----------|
 |code                                    |          |
 |----------------------------------------|          |
 |S01                                     |         3|
 |----------------------------------------+----------|
 |S03                                     |         2|
 -----------------------------------------------------

表2

shop 東京2
 ----------------------------------------------------------------
 |                                        |        date         |
 |                                        |---------------------|
 |                                        | 01-01-01 | 01-01-02 |
 |                                        |----------+----------|
 |                                        |   数量   |   数量   |
 |----------------------------------------+----------+----------|
 |code                                    |          |          |
 |----------------------------------------|          |          |
 |S01                                     |         3|         .|
 |----------------------------------------+----------+----------|
 |S02                                     |         .|         .|
 |----------------------------------------+----------+----------|
 |S03                                     |         2|         .|
 ----------------------------------------------------------------

[回答]

SAS System 8から追加されたCLASSDATAオプションを使って、出力するクラス変数の値を制御できます。表に含めるクラス変数の値の組み合わせをデータセットにしておき、TABULATEプロシジャで「CLASSDATA=データセット名」を指定します。ご質問の例の場合、クラス変数SHOP、CODE、DATEの全組み合わせを含めた次のようなCLASSDATAデータセットを作ります。

CLASSDATA データセット

OBS     shop     code        date

  1    東京1    S01     01-01-01
  2    東京1    S02     01-01-01
  3    東京1    S03     01-01-01
  4    東京2    S01     01-01-01
  5    東京2    S02     01-01-01
  6    東京2    S03     01-01-01
  7    東京1    S01     01-01-02
  8    東京1    S02     01-01-02
  9    東京1    S03     01-01-02
 10    東京2    S01     01-01-02
 11    東京2    S02     01-01-02
 12    東京2    S03     01-01-02

プログラム例

OPTIONS PAGENO=1;
                                      /* サンプルデータセットの作成*/
DATA sales;
  INPUT  shop $ code $ date yymmdd10. +1 suryo;
  FORMAT date yymmdd8.;
CARDS;
東京1 S01 2001/01/01 3
東京1 S02 2001/01/01 1
東京1 S03 2001/01/01 2
東京2 S01 2001/01/01 3
東京2 S03 2001/01/01 2
東京1 S01 2001/01/02 1
東京1 S02 2001/01/02 1
東京1 S03 2001/01/02 1
;
RUN;     

                                /* CLASSDATAデータセットの作成*/
PROC SQL;
  CREATE table _class AS
  SELECT * FROM
  (SELECT DISTINCT(shop) FROM sales) ,
  (SELECT DISTINCT(code) FROM sales) ,
  (SELECT DISTINCT(date) FROM sales) ;
QUIT;

PROC TABULATE DATA=sales CLASSDATA=_class ;
  CLASS    shop code date;
  VAR      suryo;
  TABLES   shop,code,date*suryo='数量'*f=10. ;
  KEYLABEL sum=' ';
RUN;