LOOKUP式を使用した文間参照

EQLでは文を定義し、LOOKUP式を介してその文を他の文から参照できます。

複数のEQL副問合せを、1つのナビゲーション問合せのコンテキストの中で指定できます。それぞれが別の分析ビューに、または別の粒度レベルの小計に対応します。式でも、他の計算済の文からの値を使用できます。これが役に立つのは、詳細なレベルのバケットの中で分析計算するために、より粗いレベルの小計が必要である場合です。

たとえば、指定された年の各販売員の売上の割合(%)を計算するには、その年の総計も計算する必要があります。ルックアップ表を使用すると、この種の問合せを作成できます。

LOOKUP式の構文

LOOKUP式は、単純な形式の結合です。先行する文の結果を、ルックアップ表として扱います。

LOOKUP式の構文は次のとおりです。
<LookupExpr> ::= <statement-name>[<LookupList>].<attribute-name>
角カッコ演算子はリテラルであり、レコード・セットおよびグルーピング属性を識別するために使用されます。一方、ドット演算子もリテラルですが、これはフィールドを識別するために使用されます。
LookupListのBNFは次のとおりです。
<LookupList> ::= <empty>
             ::= <SimpleExpr> [,<LookupList>]
このBNF構文では、角カッコは2番目のLookupListをオプションで使用することを示します。

ルックアップ・リストは、指定された文のグルーピング属性に対応します。結果がNULLになるのは、ルックアップ・リストがターゲット・グループ・キー値に一致しない場合や、一致するターゲット・グループ・キー値のターゲット列がNULLである場合です。

ルックアップ属性は、ターゲット文のGROUP BY句を順番に参照します。索引付きの値の計算ルックアップも可能です。つまり、次の例に示すように、関連情報(たとえば、前年の売上合計)のルックアップが可能です。
DEFINE YearTotals AS SELECT
  SUM(SalesAmount) AS Total
FROM SaleState
GROUP BY Year;

RETURN AnnualCategoryPcts AS SELECT
  SUM(SalesAmount) AS Total,
  Total/YearTotals[Year].Total AS Pct
FROM SaleState
GROUP BY Year, Category;

RETURN YoY AS SELECT
  YearTotals[Year].Total AS Total,
  YearTotals[Year-1].Total AS Prior,
  (Total-Prior)/Prior AS PctChange
FROM SaleState
GROUP BY Year

状態に対するLOOKUPの使用

LOOKUP式は、ターゲット文が指定した状態を参照している場合サポートされます。この場合のルールとして角カッコ内には式が1つのみで、これがターゲット状態の主キーに対して一致されます。

複数のルックアップ・キーを状態に対して使用すると、EQLは次の例のようなエラー・メッセージを返します。この例では、2つのルックアップ・キーを使用しています。
In the definition of attribute "x": The LOOKUP expression has 2 lookup value(s); a LOOKUP expression that refers 
to state "Sales" must have exactly one lookup value, corresponding to the state's primary key "SalesID"

別の文からの値の参照

たとえば、ProductType別、Region別の売上比率を計算するとします。集計の1つではRegionごとにグルーピングした合計を計算し、それに続く集計でRegionとProductTypeごとにグルーピングした合計を計算します。

この2番目の集計で使用する式で、Regionの集計の結果を参照します。つまり、RegionとProductTypeのペアごとに、そのRegion全体の小計にProductTypeが占める割合を計算できます。

DEFINE RegionTotals AS
SELECT SUM(Amount) AS Total
FROM SaleState
GROUP BY Region;

RETURN ProductPcts AS
SELECT 
  100 * SUM(Amount) / RegionTotals[Region].Total AS PctTotal
FROM RegionTotals
GROUP BY Region, ProductType
最初の文では、各地域の製品売上合計を計算します。次の文で、RegionTotalsの結果を使用して各地域の割合を求めます。このときに、文間参照構文を使用します。
  • 角カッコ演算子は、RegionTotalsの結果のうち、group-byの値がRegion属性のProductPctsの値に等しいものを参照することを示します。
  • ドット演算子は、指定されたRegionTotalsレコードのTotalフィールドを参照することを示します。

売上の割合の計算

この例では、四半期別に、各製品タイプの売上の割合を計算します。

この問合せでは、1つの文で計算した情報を別の文で使用できるようにする必要があります。

指定された製品の売上を、指定された四半期の売上合計に占める割合として計算するには、四半期売上を計算して保存する必要があります。これで、四半期/製品ペアごとに計算するときに、対応する四半期合計を取り出せるようになります。
DEFINE QuarterTotals AS
SELECT SUM(Amount) AS Total
FROM SaleState
GROUP BY Quarter;

RETURN ProductPcts AS
SELECT 
  100 * SUM(Amount) / QuarterTotals[Quarter].Total AS PctTotal
FROM QuarterTotals
GROUP BY Quarter, ProductType