LET句

LET句では、文内の他の箇所で使用されるが、文の結果に必ずしも出現しない属性を定義します。

LETの主な用途は、計算した属性の値によるグルーピング(特に、計算した属性のMEMBERSによるグルーピング)を容易にすることです。ただし、LETは、グルーピングであってもなくても任意の文で使用し、文内の他の場所で使用される一時的な値を定義できます。

構文は次のとおりです。
LET <expression> [AS <attribute>][, <expression> [AS <attribute>]]*
LETは任意の文に使用でき、次の例のようにSELECT句の直前に使用します。
RETURN Results AS
LET
   x + y AS intermediateSum
SELECT
   MIN(x) AS min_x,
   intermediateSum + z AS finalSum
FROM WineState
GROUP BY finalSum
Results文の出力には、min_xおよびfinalSumの2つの属性のみが含まれます。LETにバインドされた属性intermediateSumは出力に含まれません。
LETを使用する場合は、(前述の例のように)SELECT句の直前に使用し、その後にカンマで区切った1つ以上の属性定義を続ける必要があります。これらの属性定義は、SELECTの後にある属性定義とまったく同様に機能します。特に、定義の左側の式が属性参照のみ(オプションでデータソース修飾子付き)の場合、定義のAS句はオプションです。つまり、次のように記述できます。
LET x,
  State.y AS y,
  3 as z
上記のメッセージは下のメッセージと同じです。
LET x AS x,
  State.y AS y,
  3 as z

LET属性は、WHERE句(ある場合)の直後、SELECT属性の計算前に計算されます。

LET属性は、グルーピングの前に計算されるため、AVGSUMなどの集計関数はLET句では無効で、コンテキスト内に集計関数があるとEQLはエラーを表示します。

LETのスコーピング

LETで定義された属性は次のスコープ内にあります。
  • 同じ文内のすべての後続のLET定義
  • 同じ文内のすべてのSELECT定義
  • 同じ文内のMEMBERSを含むGROUP BY

また、LET属性がグルーピング・キーとして使用される場合、文の結果にも含まれ、ORDER BYおよびHAVING句で使用できます。属性がグルーピング・キーではない場合、ORDER BYまたはHAVINGのスコープ内にはありません。

次の例で、LETのスコーピング・ルールを示します。
RETURN results AS
LET
  (FOREACH d IN orderDates RETURN (EXTRACT(d, YEAR))) AS orderYears
SELECT
  MAX(totalCost) AS maxCost
FROM OrderHistory
GROUP BY orderYears
HAVING 2014 IN orderYears

例では、データソースOrderHistorymdex:dateTime-set型の属性orderDatesが定義されるものとします。orderYears属性の定義によってorderDatesの各日付から年が抽出され、これらの年がセットに再構成されます。この文では、注文年のセットによって結果がグルーピングされ、それぞれの最大コストが計算されて、orderDatesに2014年の日付が1つ以上ある注文の行が返されます。orderYearsは、グループ・キーであるため、出力表には2つの属性(maxCostおよびorderYears)が含まれ、orderYearsHAVING句で使用できます。

かわりに、次の例を考えてみます。
RETURN results AS
LET
  (FOREACH d IN orderDates RETURN (EXTRACT(d, YEAR))) AS orderYears
SELECT
  MAX(totalCost) AS maxCost
FROM OrderHistory
GROUP BY MEMBERS(orderYears) AS yr

この文は前述の例と同じですが、この文はorderYearsではなく、そのメンバーでグルーピングする点が異なります。したがって、orderYearsはグループ・キーではなく、グループ・キーyrの計算に使用されるのみです。そのため、orderYearsは文の出力には含まれず、HAVING句またはORDER BY句で使用できません。(文の出力には、yrおよびmaxCostの2つの属性が含まれます。)

前述のルールをまとめると、グルーピング文以外ではLET属性は出力に含まれず、HAVINGおよびORDER BY句で使用できません。