APPENDにはDFIXがおすすめ
本記事では複数のデータを縦に結合する方法について紹介します。
SQLではUNIONと呼ばれる結合内容です。
SQLのUNIONは、WebFOCUSではAPPEND
WebFOCUSでデータを縦に結合する場合は、HOLDファイルを作成して、2つ目以降のデータを追記していく方法になります。この追記形式のことをAPPENDと呼んでいます。
基本構文
SET ASNAMES = ON
SET PAGE-NUM = NOLEAD
-* 1つ目のデータ
FILEDEF HOLD論理名 DISK 物理ファイル名
TABLE FILE xxx
(リクエスト)
ON TABLE HOLD AS HOLD論理名 FORMAT DFIX
DELIMITER ','
ENCLOSURE '"'
HEADER NO
END
-RUN
-* 2つ目のデータ(1つ目に追記するデータ)
FILEDEF HOLD論理名 DISK 物理ファイル名 (APPEND
TABLE FILE xxx
(リクエスト)
ON TABLE SAVE AS HOLD論理名 FORMAT DFIX
DELIMITER ','
ENCLOSURE '"'
HEADER NO
END
-RUN
TABLE FILE 物理ファイル名
(リクエスト)
END
サンプル
2つのCOST列(DEALER_COST、RETAIL_COST)を1つの列(COST)にまとめるサンプルです。
サンプルの実装イメージ
元データ
加工後データ例
サンプルコード
1つ目のリクエストにて、DEALER_COST項目を集計しています。
この時に項目名を COST に変更しています。
また、どのコストなのか判別できるように、CATEGORY項目を新規に作成して DEALER_COST であることを記載しています。中間ファイルの論理名はHLD1、物理ファイルはhld.csvです。
2つ目のリクエストでは、同じような処理イメージで RETAIL_COST項目を集計しています。
2つ目のリクエストはhld.csvにデータを追記するため「FILEDEF 2つ目の論理名 DISK 1つ目の物理ファイル名 (APPEND」を指定しています。また「ON TABLE SAVE」となっていますが、これは二次検索用のシノニムを省略してデータ部分のみを作成するコマンドです。
(シノニムについては1つ目のリクエストで作成済みのため、2つ目のリクエストでは不要です。)
SET ASNAMES = ON
SET PAGE-NUM = NOLEAD
FILEDEF HLD1 DISK hld.csv
TABLE FILE CAR
SUM DEALER_COST AS 'COST'
COMPUTE CATEGORY/A20V = 'DEALER_COST';
BY COUNTRY
ON TABLE HOLD AS HLD1 FORMAT DFIX
DELIMITER ','
ENCLOSURE '"'
HEADER NO
END
-RUN
FILEDEF HLD2 DISK hld.csv (APPEND
TABLE FILE CAR
SUM RETAIL_COST AS 'COST'
COMPUTE CATEGORY/A20V = 'RETAIL_COST';
BY COUNTRY
ON TABLE SAVE AS HLD2 FORMAT DFIX
DELIMITER ','
ENCLOSURE '"'
HEADER NO
END
-RUN
TABLE FILE HLD1
SUM COST
BY COUNTRY
ACROSS CATEGORY
END
APPENDするファイルフォーマットにDFIXを利用する
APPEND は DFIX のような CSV 以外の HOLD 形式に対しても有効です。
CSV 以外の形式では、例えば FORMAT BINARY や FORMAT ALPHA 等があります。
DFIX は可変長の CSV データとなるため、BINARY や ALPHA に比べてデータサイズが小さく、ファイル生成や二次検索の処理が少しだけ早いフォーマットです。
FORMAT ALPHA 等で実装済みのコードがあるようであれば、上記のサンプルのように、「FORMAT DFIX DELIMITER ‘,’ ENCLOSURE ‘”‘ HEADER NO」に置き換えてみると少しだけ早くなるかも知れません。