GROUP コマンド
テーブルの次のレコードに移動する前に、テーブルを 1 回通過するだけで、レコードに対して 1 つ以上の ACLScript コマンドを実行します。コマンド実行は条件によって制御できます。
構文
GROUP <IF テスト> <WHILE テスト> <FIRST 範囲|NEXT 範囲> コマンド <...n> <ELSE IF テスト> コマンド <...n> <ELSE> コマンド <...n> END
メモ
一部の Analytics コマンドは、GROUP コマンドとともに使用できません。詳細については、GROUP コマンドの内部で使用することができるコマンドを参照してください。
パラメーター
名前 | 説明 |
---|---|
IF テスト 省略可能 |
各レコードを処理するために真である必要がある条件式。コマンドは、その条件を満たすレコードに対してのみ実行されます。 メモ IF パラメーターは、任意の範囲パラメーター(WHILE、FIRST、NEXT)が適用された後に、テーブルに残るレコードに対してのみ評価されます。 |
WHILE テスト 省略可能 |
各レコードを処理するために真である必要がある条件式。条件が false と評価するか、テーブルの最後に達したら、コマンドは実行を中止します。 メモ WHILE を FIRST または NEXT とともに使用する場合は、1 つの制限に達するとすぐに、レコードの処理が停止します。 |
FIRST 範囲 | NEXT 範囲 省略可能 |
処理するレコード数:
範囲は処理するレコード数を指定します。 FIRST と NEXT を省略すると、すべてのレコードがデフォルトで処理されます。 |
コマンド <...n> |
GROUP 内で実行する 1 つまたは複数の ACLScript コマンド。GROUP 内で使用できるコマンドの詳細な一覧については、GROUP コマンドの内部で使用することができるコマンドを参照してください。 これらの各コマンドの前に IF または ELSE IF がある場合には、テストの評価結果が true になる必要があります。 これらの各コマンドが ELSE より後に記述されている場合は、そのコマンドより前にあるどのコマンドでも処理されていないレコードが存在するときに、そのコマンドが実行されます。各コマンドは別々の行で開始して、複数のコマンドを含めることができます。 |
ELSE IF テスト 省略可能 |
GROUP コマンドの ELSE IF ブロックを開きます。この条件は、GROUP コマンド テスト、およびその条件より前にあるどの ELSE IF テストにも適合しなかったレコードをテストするものです。 複数の ELSE IF テストを含めることができ、それらは上から下へ、レコードが True と評価されて、その ELSE IF ステートメントに続くコマンドが実行されるまで評価されます。 |
ELSE 省略可能 |
GROUP コマンドの ELSE ブロックを開きます。このブロックより前にあるすべてのテストが False と評価されたレコードに対し、このブロックに入力したコマンドが実行されます。 |
END | GROUP コマンドの終わり。 |
例
単純な GROUP
単純なグループは、GROUP コマンドで始まり、その後に一連のコマンド群が続き、END コマンドで終わります。
GROUP COUNT HISTOGRAM ON Quantity MINIMUM 0 MAXIMUM 100 INTERVALS 10 CLASSIFY ON Location SUBTOTAL Quantity END
GROUP IF
条件付きグループでは、条件が True または False のどちらであるかに基づいてコマンドを実行します。たとえば、次の GROUP コマンドは、Product_class フィールドの値が 5 未満であるレコードに対してのみ実行されます。
GROUP IF Product_class < "05" COUNT HISTOGRAM ON Quantity MINIMUM 0 MAXIMUM 100 INTERVALS 10 CLASSIFY ON Location SUBTOTAL Quantity END
GROUP IF ...ELSE
ELSE ブロックを指定しない限り、条件を満たしていないレコードは無視されます。
ELSE ステートメントに続くコマンドの数に制限はありません。次の例では、条件を満たしていないレコードすべての Quantity フィールドを合計します。
GROUP IF Product_class < "05" COUNT HISTOGRAM ON Quantity MINIMUM 0 MAXIMUM 100 INTERVALS 10 CLASSIFY ON Location SUBTOTAL Quantity ELSE TOTAL Quantity END
GROUP IF...ELSE IF...ELSE
ELSE IF ブロックは、各ブロックが別々の条件式であれば、グループ内に複数指定できます。次の例では、ELSE IF および ELSE ブロックは 4 つの合計を生成します。
GROUP IF Product_class < "05" COUNT HISTOGRAM ON Quantity MINIMUM 0 MAXIMUM 100 INTERVALS 10 CLASSIFY ON Location SUBTOTAL Quantity ELSE IF Product_class = "05" TOTAL Quantity ELSE IF Product_class = "06" TOTAL Quantity ELSE IF Product_class = "07" TOTAL Quantity ELSE TOTAL Quantity END
入れ子の GROUP コマンド
入れ子のグループとは、別のグループの中に入っているグループのことをいいます。入れ子のグループを使用すると、レコードに対してどのコマンドを実行するかを強力に制御できます。ほとんどのアプリケーションではこうした高度な機能は必要ありませんが、必要に応じて使用することができます。
ほかの種類のグループと同様、入れ子のグループの終了には END コマンドを使用します。Analytics のデータ処理は、すべてのグループ コマンドが終了してから開始されます。
GROUP IF Product_class < "05" COUNT STRATIFY ON Quantity SUBTOTAL Quantity MIN 0 MAX 100 INT 10 GROUP IF Quantity > 0 STATISTICS ON Quantity HISTOGRAM ON Quantity END ELSE TOTAL Quantity END
この例では、Product_class が 05 未満である場合にのみ、COUNT から次の GROUP までに含まれるコマンドすべてが実行されます。
STATISTICS コマンドと HISTOGRAM コマンドは、Quantity が 0 より大きい場合にのみ実行されます。ただし、2 番目の GROUP コマンドは入れ子になっているため、STATISTICS コマンドと HISTOGRAM コマンドは、Product_class < "05" の条件と Quantity > 0 の条件の両方を満たすレコードに対してのみ実行されます。
GROUP ブロック内でシステム変数を生成する
1 つの GROUP コマンドで、複数のシステム変数を作成できます。
通常、TOTAL、COUNT、STATISTICS などのコマンドを実行すると、ただ 1 つのシステム変数が生成されます。コマンドを実行するたびに、前回のコマンド実行によって生成されたシステム変数の値は上書きされます。GROUP ブロック内で実行されるコマンドのインスタンスごとに、固有の変数が作成されます。
次の例では、TOTAL コマンドにより、Metaphor_Trans_2002 テーブル内の各製品クラスの Amount フィールドの合計が計算されます。下記のコードを実行すると、以下の変数が生成され、GROUP ブロックの後続のコマンド内で使用できるようになります。
- TOTAL2 製品クラス 03 の Amount フィールドの合計
- TOTAL3 製品クラス 05 の Amount フィールドの合計
- TOTAL4 製品クラス 08 の Amount フィールドの合計
- TOTAL5 製品クラス 09 の Amount フィールドの合計
OPEN Metaphor_Trans_2002 GROUP TOTAL AMOUNT IF PRODCLS = "03" TOTAL AMOUNT IF PRODCLS = "05" TOTAL AMOUNT IF PRODCLS = "08" TOTAL AMOUNT IF PRODCLS = "09" END CLOSE Metaphor_Trans_2002
備考
ヒント
GROUP および LOOP コマンドの詳細なチュートリアルについては、グループ化とループ処理を参照してください。
GROUP コマンドの内部で使用することができるコマンド
以下の表は Analytics コマンドの内部で使用することができるコマンドを示しています。
コマンドが以下の一覧にない場合は、GROUP 内で使用できません。
AGE | ASSIGN | BENFORD |
CLASSIFY | COMMENT | COUNT |
CROSSTAB | DUPLICATES | EXPORT |
EXTRACT | GAPS | GROUP |
HISTOGRAM | JOIN | LIST |
LOOP | MERGE | PROFILE |
REPORT | SEQUENCE | STATISTICS |
STRATIFY | SUMMARIZE | TOTAL |
VERIFY |
グループ化とループ処理
GROUP コマンドを使用すると、テーブル内の次のレコードに移動する前にレコードにいくつかのコマンドを実行することができます。これにより、処理時間を大幅に減らすことができます。
レコードに対して一連のコマンドを複数回実行する必要がある場合には、GROUP コマンド内で LOOP コマンドを使用することができます。
GROUP での変数の使用
ユーザー定義変数
GROUP コマンド内で変数を使用するには、その GROUP ブロックを入力する前に、その変数を定義しておきます。
メモ
GROUP のブロック内で変数を定義して初期化することもできますが、お勧めしません。GROUP 内で初期化された変数を使用すると、予期しない結果が生成される場合があります。
グループで変数を評価するには、代入変数を使用します。変数の値は、GROUP 内に入る前の値から変わらなくなります。
GROUP 内で変数を定義した場合に、代入変数を使ってその変数を参照することはできません。
ASSIGN v_test = "hello" GROUP ASSIGN v_test2 = "%v_test% world" COMMENT これは無効です: v_test3 = "%v_test2% again" END
システム定義変数
TOTAL や STATISTICS など特定のコマンドでは、実行する計算に基づくシステム変数を生成します。これらのコマンドを実行するのに GROUP を使用すると、生成されるすべてのシステム変数には連続番号が付けられます。この連続番号は、GROUP ブロック内のコマンドの行番号で始まり、n で終わります(空行は除く)。n の値は GROUP ブロック内の行番号 1 つごとに 1 ずつ増加します。
メモ
GROUP ブロック内で作成されたシステム生成変数を使用するには、GROUP ブロックが完了するまで待つ必要があります。変数が使用可能になるには、コマンドがテーブル内のすべてのレコードに対して実行される必要があります。これらの変数は、GROUP ブロックを終了する END キーワードの後に使用してください。
次の例では、最初の TOTAL コマンドにより変数 TOTAL2 が生成され、2 番目の TOTAL コマンドにより変数 TOTAL4 が生成されます。これらの変数は両方とも、GROUP ブロックの完了後に後続のコマンドで使用できます。
GROUP TOTAL Discount IF Order_Priority = "Low" ASSIGN v_var = "test" TOTAL Discount IF Order_Priority = "High" END
構文に関するメモ
- GROUP コマンドには複数行の構文の記述が必要なため、コマンド ラインでこのコマンドを入力することはできません。
- 各 GROUP コマンドは END コマンドで終了する必要があります。
- スクリプト内で GROUP コマンドを使用するときは、グループ内に記載されたコマンドをインデントすることにより、コマンド ブロックの読みやすさを向上させることができます。