Поделиться через


Generate (многомерные выражения)

Применяет набор к каждому элементу другого набора и соединяет результирующие наборы. В качестве альтернативы эта функция также возвращает объединенную строку, созданную путем вычисления строкового выражения по набору.

Синтаксис

Set expression syntax
Generate( Set_Expression1 , ( Set_Expression2 [ , ALL ] ) )

String expression syntax
Generate( Set_Expression1 , ( String_Expression [ ,Delimiter ] ) )

Аргументы

  • Set_Expression1
    Допустимое многомерное выражение, возвращающее набор.

  • Set_Expression2
    Допустимое многомерное выражение, возвращающее набор.

  • String_Expression
    Допустимое строковое выражение, обычно обозначающее имя текущего элемента (CurrentMember.Name) каждого кортежа в указанном наборе.

  • Delimiter
    Допустимый разделитель в виде строкового выражения.

Замечания

Если указан второй набор, функция Generate возвращает набор, сформированный путем применения кортежей второго набора к каждому кортежу первого набора, и последующего объединения результирующих наборов. Если задано ключевое слово ALL, функция сохраняет повторяющиеся значения в результирующем наборе.

Если строковое выражение указано, функция Generate возвращает строку, сформированную путем вычисления строкового выражения из каждого кортежа первого набора, и последующим объединением результатов. При необходимости строка может содержать разделители, отделяющие результаты в объединенной строке друг от друга.

Примеры

Набор

В следующем примере запрос возвращает набор, содержащий «Меры Сумма продаж через Интернет» четыре раза, так как набор [Date].[Calendar Year].[Calendar Year].MEMBERS включает четыре элемента:

SELECT 
GENERATE( [Date].[Calendar Year].[Calendar Year].MEMBERS
, {[Measures].[Internet Sales Amount]}, ALL)
ON 0
FROM [Adventure Works]

Удаление ALL изменяет запрос так, что «Меры Сумма продаж через Интернет» возвращается только один раз:

SELECT 
GENERATE( [Date].[Calendar Year].[Calendar Year].MEMBERS
, {[Measures].[Internet Sales Amount]}
ON 0
FROM [Adventure Works]

Наиболее распространенное практическое применение функции Generate — вычисление сложных выражений набора, таких как TopCount, по набору элементов. Запрос в следующем примере показывает 10 лучших продуктов для каждого календарного года по строкам:

SELECT 
{[Measures].[Internet Sales Amount]}
ON 0,
GENERATE( 
[Date].[Calendar Year].[Calendar Year].MEMBERS
, TOPCOUNT(
[Date].[Calendar Year].CURRENTMEMBER
[Product].[Product].[Product].MEMBERS
,10, [Measures].[Internet Sales Amount]))
ON 1
FROM [Adventure Works]

Обратите внимание, что для каждого года отображается 10 разных лучших продуктов, и использование функции Generate — единственный способ получить этот результат. Простое перекрестное соединение календарных лет и набора 10 лучших продуктов покажет 10 лучших продуктов за весь период времени с повтором для каждого года, как показано в следующем примере:

SELECT 
{[Measures].[Internet Sales Amount]}
ON 0,
[Date].[Calendar Year].[Calendar Year].MEMBERS
TOPCOUNT(
[Product].[Product].[Product].MEMBERS
,10, [Measures].[Internet Sales Amount])
ON 1
FROM [Adventure Works]

Строка

В следующем примере показано использование функции Generate для получения строки:

WITH 
MEMBER MEASURES.GENERATESTRINGDEMO AS
GENERATE( 
[Date].[Calendar Year].[Calendar Year].MEMBERS,
[Date].[Calendar Year].CURRENTMEMBER.NAME)
MEMBER MEASURES.GENERATEDELIMITEDSTRINGDEMO AS
GENERATE( 
[Date].[Calendar Year].[Calendar Year].MEMBERS,
[Date].[Calendar Year].CURRENTMEMBER.NAME, " AND ")
SELECT 
{MEASURES.GENERATESTRINGDEMO, MEASURES.GENERATEDELIMITEDSTRINGDEMO}
ON 0
FROM [Adventure Works]
ПримечаниеПримечание

Эта форма функции Generate может быть полезна при отладке вычислений, поскольку позволяет получить строку, включающую имена всех элементов в наборе. Прочитать ее может быть проще, чем строгое представление многомерного выражения набора, возвращаемое функцией SetToStr (многомерные выражения).