APPENDにはDFIXがおすすめ

2024年3月23日テクニカルメモ

本記事では複数のデータを縦に結合する方法について紹介します。
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」に置き換えてみると少しだけ早くなるかも知れません。