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


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) каждого кортежа в указанном наборе.

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

Замечания

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

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

Примеры

Set

В следующем примере запрос возвращает набор, содержащий меру Measure Internet Sales четыре раза, так как набор [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 из запроса мера Internet Sales Amount возвращается только один раз:

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

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

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 является единственным способом получить этот результат. Простое перекрестное соединение таблицы Calendar Year и набора 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 (многомерные выражения).

См. также

Справочник по функции многомерных выражений (многомерные выражения)