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「結果」文の出力には、min_xとfinalSumの2つの属性のみが含まれています。
LETバウンドの属性intermediateSumは出力に表示されません。
LETはSELECT句の直前(前述の例を参照)に配置され、その後に1つ以上の属性定義をカンマで区切って指定する必要があります。 これらの属性定義は、SELECTの後に表示される定義とまったく同じように機能します。 特に、定義の左側の式がbare属性参照(オプションでdata-source修飾子)である場合、定義の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属性が計算されるため、AVGやSUMのようなアグリゲータは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
この例では、データソースOrderHistoryでmdex:dateTime-setタイプの属性orderDatesが定義されているものとします。 orderYears属性の定義により、orderDatesの各日付から年が抽出され、これらの年がセットに再割当されます。 この文では、受注年のセットで結果をグループ化し、それぞれの最大原価を計算し、orderDatesで2014年の少なくとも1日を持つオーダーに対する行を返します。 orderYearsはグループ・キーであるため、出力表には2つの属性(maxCostおよびorderYears)、orderYearsはHAVING句で使用できます。
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句に表示されることもありません。