Обработка данных MDX — SELECT

Получает данные из заданного куба.

Syntax

  
[ WITH <SELECT WITH clause>   
   [ , <SELECT WITH clause>...n ]   
]   
SELECT   
     [ *   
    | ( <SELECT query axis clause>   
                  [ , <SELECT query axis clause>,...n ]   
            )   
            ]  
FROM   
   <SELECT subcube clause>   
      [ <SELECT slicer axis clause> ]  
      [ <SELECT cell property list clause> ]  
  
<SELECT WITH clause> ::=  
     ( CELL CALCULATION <CREATE CELL CALCULATION body clause> )   
   | ( [ CALCULATED ] MEMBER <CREATE MEMBER body clause>)   
   | ( SET <CREATE SET body clause>)  
   | ( MEASURE = <measure body clause> )  
  
<SELECT query axis clause> ::=  
   [ NON EMPTY ] Set_Expression  
   [ <SELECT dimension property list clause> ]   
      ON   
            Integer_Expression   
       | AXIS(Integer)   
       | COLUMNS   
       | ROWS   
       | PAGES   
       | SECTIONS   
       | CHAPTERS   
  
<SELECT subcube clause> ::=  
      Cube_Name   
   | [NON VISUAL] (SELECT   
                  [ *   
       | ( <SELECT query axis clause> [ ,   
           <SELECT query axis clause>,...n ] )   
         ]   
            FROM   
         <SELECT subcube clause>   
         <SELECT slicer axis clause> )  
  
<SELECT slicer axis clause> ::=   
      WHERE Tuple_Expression  
  
<SELECT cell property list clause> ::=   
   [ CELL ] PROPERTIES CellProperty_Name   
      [ , CellProperty_Name,...n ]  
  
<SELECT dimension property list clause> ::=  
   [DIMENSION] PROPERTIES   
      (DimensionProperty_Name   
         [,DimensionProperty_Name,...n ] )   
    | (LevelProperty_Name   
         [, LevelProperty_Name,...n ] )   
    | (MemberProperty_Name   
         [, MemberProperty_Name,...n ] )  

Arguments

Set_Expression
Допустимое выражение многомерных выражений (MDX), которое возвращает множество.

Целое число
Целое число от 0 до 127.

Cube_Name
Действительная строка, предоставляющая имя куба.

Tuple_Expression
Допустимое выражение многомерных выражений (MDX), возвращающее кортеж.

CellProperty_Name
Действительная строка, представляющая свойство ячейки.

DimensionProperty_Name
Допустимая строка, представляющая свойство размерности.

LevelProperty_Name
Действительная строка, представляющая свойство уровня.

MemberProperty_Name
Действительная строка, представляющая свойство элемента.

Remarks

Выражение должно содержать элементы в размерностях и иерархиях, отличных от тех, <SELECT slicer axis clause> что указаны в указанных <SELECT query axis clause> выражениях.

Если атрибут в кубе опущен в указанных <SELECT query axis clause> выражениях и значении <SELECT slicer axis clause> , элемент по умолчанию атрибута неявно добавляется к оси слайсера.

Опция NON VISUAL в операторе subselect позволяет фильтровать участников, сохраняя истинные итоги вместо отфильтрованных. Это позволяет делать запросы по десяти лучшим продажам (лица/продукты/регионы) и получать истинное общее количество продаж для всех запрошенных участников, а не общую сумму продаж для десяти вернутых участников. Подробнее см. примеры ниже.

Вычисленные члены могут быть включены в <клаузу> SELECT запроса, когда соединение было открыто с помощью строка подключения parameter subqueries=1; см. Поддерживаемые свойства XMLA (XMLA) и ConnectionString для использования параметров. Приведён пример для вычисленных членов в подселектах.

Автосуществование

Когда в операторе SELECT используются два или более атрибутов измерения, Analysis Services оценивает выражения атрибутов, чтобы убедиться, что члены этих атрибутов правильно ограничены для соответствия критериям всех остальных атрибутов. Например, предположим, что вы работаете с атрибутами из географического измерения. Если у вас есть одно выражение, которое возвращает всех участников атрибута Город, и другое, ограничивающее участников атрибута Страны всеми странами/регионами Европы, то это приведёт к тому, что члены города будут ограничены только теми городами, которые принадлежат странам или регионам Европы. Эта характеристика Analysis Services называется Autoexists и применяется только к атрибутам в том же измерении. Автовключение применяется только к атрибутам из того же измерения, так как оно пытается предотвратить включение записей измерений, исключенных в одном выражении атрибута, другими выражениями атрибута. Автосуществование также можно понимать как полученное пересечение различных выражений атрибутов над записями размерности. См. следующие примеры ниже:

//Obtain the Top 10 best reseller selling products by Name  
with member [Measures].[PCT Discount] AS '[Measures].[Discount Amount]/[Measures].[Reseller Sales Amount]', FORMAT_STRING = 'Percent'  
set Top10SellingProducts as 'topcount([Product].[Model Name].children, 10, [Measures].[Reseller Sales Amount])'  
set Preferred10Products as '  
{[Product].[Model Name].&[Mountain-200],  
[Product].[Model Name].&[Road-250],  
[Product].[Model Name].&[Mountain-100],  
[Product].[Model Name].&[Road-650],  
[Product].[Model Name].&[Touring-1000],  
[Product].[Model Name].&[Road-550-W],  
[Product].[Model Name].&[Road-350-W],  
[Product].[Model Name].&[HL Mountain Frame],  
[Product].[Model Name].&[Road-150],  
[Product].[Model Name].&[Touring-3000]  
}'  
select {[Measures].[Reseller Sales Amount], [Measures].[Discount Amount], [Measures].[PCT Discount]} on 0,  
Top10SellingProducts on 1  
from [Adventure Works]  

Полученный результирующий набор данных:

Название модели + Меры Объем продаж реселлера Сумма скидки Скидка на PCT
Mountain-200 $14,356,699,36 $19,012.71 0.13%
Дорога-250 $9,377,457,68 $ 4032.47 0.04%
Mountain-100 $8,568,958,27 $139,393,27 1.63%
Дорога-650 $ 7,442,141.81 $39,698.30 0.53%
Туринг-1000 $6,723,794,29 $166,144.17 2.47%
Road-550-W $3668,383,88 $ 1901.97 0.05%
Road-350-W $3,665,932,31 $20,946,50 0.57%
Горная рама HL $3,365,069,27 $174.11 0.01%
Дорога-150 $2,363,805.16 $0,00 0.00%
Туринг-3000 $2046,508,26 $79,582.15 3.89%

Полученный набор продуктов, как представляется, совпадает с Preferred10Products; то есть проверьте набор Preferred10Products:

with member [Measures].[PCT Discount] AS '[Measures].[Discount Amount]/[Measures].[Reseller Sales Amount]', FORMAT_STRING = 'Percent'  
set Top10SellingProducts as 'topcount([Product].[Model Name].children, 10, [Measures].[Reseller Sales Amount])'  
set Preferred10Products as '  
{[Product].[Model Name].&[Mountain-200],  
[Product].[Model Name].&[Road-250],  
[Product].[Model Name].&[Mountain-100],  
[Product].[Model Name].&[Road-650],  
[Product].[Model Name].&[Touring-1000],  
[Product].[Model Name].&[Road-550-W],  
[Product].[Model Name].&[Road-350-W],  
[Product].[Model Name].&[HL Mountain Frame],  
[Product].[Model Name].&[Road-150],  
[Product].[Model Name].&[Touring-3000]  
}'  
select {[Measures].[Reseller Sales Amount], [Measures].[Discount Amount], [Measures].[PCT Discount]} on 0,  
Preferred10Products on 1  
from [Adventure Works]  

В соответствии со следующими результатами оба набора (Top10SellingProducts, Preferred10Products) одинаковы

Название модели + Меры Объем продаж реселлера Сумма скидки Скидка на PCT
Mountain-200 $14,356,699,36 $19,012.71 0.13%
Дорога-250 $9,377,457,68 $ 4032.47 0.04%
Mountain-100 $8,568,958,27 $139,393,27 1.63%
Дорога-650 $ 7,442,141.81 $39,698.30 0.53%
Туринг-1000 $6,723,794,29 $166,144.17 2.47%
Road-550-W $3668,383,88 $ 1901.97 0.05%
Road-350-W $3,665,932,31 $20,946,50 0.57%
Горная рама HL $3,365,069,27 $174.11 0.01%
Дорога-150 $2,363,805.16 $0,00 0.00%
Туринг-3000 $2046,508,26 $79,582.15 3.89%

В предыдущих примерах мы создали два множества: одно как вычисленное выражение, другое как выражение постоянного. Эти примеры иллюстрируют разные варианты Autoexists.

Autoexist может применяться глубоко или поверхностно к выражениям. Настройка по умолчанию — глубокая. В следующем примере продемонстрирована концепция глубоких Autoexists. В примере мы фильтруем Top10SellingProducts по атрибуту [Продукт].[Product Line] для тех, кто находится в группе [Mountain]. Обратите внимание, что оба атрибута (слайсер и ось) принадлежат одному и тому же измерению [Product].

with member [Measures].[PCT Discount] AS '[Measures].[Discount Amount]/[Measures].[Reseller Sales Amount]', FORMAT_STRING = 'Percent'  
set Top10SellingProducts as 'topcount([Product].[Model Name].children, 10, [Measures].[Reseller Sales Amount])'  
// Preferred10Products set removed for clarity  
select {[Measures].[Reseller Sales Amount], [Measures].[Discount Amount], [Measures].[PCT Discount]} on 0,  
Top10SellingProducts on 1  
from [Adventure Works]  
where [Product].[Product Line].[Mountain]  

Создает следующий результирующий набор:

Название модели + Меры Объем продаж реселлера Сумма скидки Скидка на PCT
Mountain-200 $14,356,699,36 $19,012.71 0.13%
Mountain-100 $8,568,958,27 $139,393,27 1.63%
Горная рама HL $3,365,069,27 $174.11 0.01%
Mountain-300 $1907,249,38 $876,95 0.05%
Mountain-500 $ 1067,327.31 $17,266,09 1.62%
Маунтин-400-W $592,450,05 $303,49 0.05%
LL Mountain Frame $521,864,42 $252,41 0.05%
ML Mountain Frame-W $482,953.16 $206,95 0.04%
ML Mountain Frame $343,785.29 $161,82 0.05%
Женские горные шорты $260,304.09 $6675,56 2.56%

В предыдущем наборе результатов семь новичков вошли в список Top10SellingProducts, а Mountain-200, Mountain-100 и HL Mountain Frame поднялись на вершину списка. В предыдущем наборе результатов эти три значения были перемежались

Это называется Deep Autoexists, потому что набор Top10SellingProducts оценивается по условиям сегментации запроса. Глубокая автоэкзистенция означает, что все выражения будут оцениваться для достижения максимально возможной глубины пространства после применения выражений среза, подвыборок выражений на оси и так далее.

Однако может потребоваться выполнить анализ над Top10SellingProducts в качестве эквивалента Preferred10Products, как показано в следующем примере:

with member [Measures].[PCT Discount] AS '[Measures].[Discount Amount]/[Measures].[Reseller Sales Amount]', FORMAT_STRING = 'Percent'  
set Top10SellingProducts as 'topcount([Product].[Model Name].children, 10, [Measures].[Reseller Sales Amount])'  
set Preferred10Products as '  
{[Product].[Model Name].&[Mountain-200],  
[Product].[Model Name].&[Road-250],  
[Product].[Model Name].&[Mountain-100],  
[Product].[Model Name].&[Road-650],  
[Product].[Model Name].&[Touring-1000],  
[Product].[Model Name].&[Road-550-W],  
[Product].[Model Name].&[Road-350-W],  
[Product].[Model Name].&[HL Mountain Frame],  
[Product].[Model Name].&[Road-150],  
[Product].[Model Name].&[Touring-3000]  
}'  
select {[Measures].[Reseller Sales Amount], [Measures].[Discount Amount], [Measures].[PCT Discount]} on 0,  
Preferred10Products on 1  
from [Adventure Works]  
where [Product].[Product Line].[Mountain]  

Создает следующий результирующий набор:

Название модели + Меры Объем продаж реселлера Сумма скидки Скидка на PCT
Mountain-200 $14,356,699,36 $19,012.71 0.13%
Mountain-100 $8,568,958,27 $139,393,27 1.63%
Горная рама HL $3,365,069,27 $174.11 0.01%

В приведенных выше результатах срез дает результат, содержащий только продукты из Preferred10Products, которые входят в группу [Mountain] в [Product].[Линия продуктов], как и ожидалось, так как Preferred10Products является константным выражением.

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

Поведение autoexists можно изменить на сеансовом уровне, используя свойство строки подключения. В следующем примере начинается открытие нового сеанса и добавление свойства Autoexists=3 в строку подключения. Чтобы сделать пример, необходимо открыть новое подключение. После установления подключения с параметром "Autoexist" оно будет оставаться в силе до завершения этого подключения.

with member [Measures].[PCT Discount] AS '[Measures].[Discount Amount]/[Measures].[Reseller Sales Amount]', FORMAT_STRING = 'Percent'  
set Top10SellingProducts as 'topcount([Product].[Model Name].children, 10, [Measures].[Reseller Sales Amount])'  
//Preferred10Products set removed for clarity  
select {[Measures].[Reseller Sales Amount], [Measures].[Discount Amount], [Measures].[PCT Discount]} on 0,  
Top10SellingProducts on 1  
from [Adventure Works]  
where [Product].[Product Line].[Mountain]  

Следующий результат теперь показывает поверхностное поведение Autoexists.

Название модели + Меры Объем продаж реселлера Сумма скидки Скидка на PCT
Mountain-200 $14,356,699,36 $19,012.71 0.13%
Mountain-100 $8,568,958,27 $139,393,27 1.63%
Горная рама HL $3,365,069,27 $174.11 0.01%

Поведение AUTOEXISTS можно изменить с помощью параметра AUTOEXISTS=[1|2|3] в строке подключения; см. сведения о поддерживаемых свойствах XMLA (XMLA) и ConnectionString использование параметра.

Примеры

Следующий пример возвращает сумму Measures.[Order Quantity] элементов, агрегированных за первые восемь месяцев календарного 2003 года, содержащихся в измерении Date , из куба Adventure Works.

WITH MEMBER [Date].[Calendar].[First8Months2003] AS  
    Aggregate(  
        PeriodsToDate(  
            [Date].[Calendar].[Calendar Year],   
            [Date].[Calendar].[Month].[August 2003]  
        )  
    )  
SELECT   
    [Date].[Calendar].[First8Months2003] ON COLUMNS,  
    [Product].[Category].Children ON ROWS  
FROM  
    [Adventure Works]  
WHERE  
    [Measures].[Order Quantity]  

Чтобы понять NON VISUAL, следующий пример — запрос в [Adventure Works] для получения данных [Reseller Sales Amount] в таблице, где категории товаров — это столбцы, а типы бизнес-реселлеров — строки. Обратите внимание, что итоги указываются как для товаров, так и для реселлеров.

Следующее утверждение SELECT:

select [Category].members on 0,  
[Business Type].members on 1  
from [Adventure Works]  
where [Measures].[Reseller Sales Amount]  

Создает следующие результаты:

Тип бизнеса + Категория Все продукты Аксессуары Велосипеды Clothing Компоненты
Все торговые посредники $80,450,596,98 $571,297,93 $66,302,381,56 $1,777,840,84 $11,799,076,66
Специализированный магазин велосипедов $6,756,166.18 $65,125.48 $6,080,117,73 $252,933,91 $357,989,07
Дилер с добавленной стоимостью $34,967,517,33 $175,002,81 $30,892,354,33 $592,385.71 $3307,774,48
Warehouse $38,726,913,48 $331,169,64 $29,329,909,50 $932,521,23 $8,133,313.11

Чтобы создать таблицу с данными только для аксессуаров и одежды, реселлеров с добавленной стоимостью и реселлеров складов, при этом сохраняя общие суммы, можно было бы записать следующим образом с использованием NON VISUAL:

select [Category].members on 0,  
[Business Type].members on 1  
from NON VISUAL (Select {[Category].Accessories, [Category].Clothing} on 0,  
{[Business Type].[Value Added Reseller], [Business Type].[Warehouse]} on 1  
from [Adventure Works])  
where [Measures].[Reseller Sales Amount]  

Создает следующие результаты:

Тип бизнеса + Категория Все продукты Аксессуары Clothing
Все торговые посредники $80,450,596,98 $571,297,93 $1,777,840,84
Дилер с добавленной стоимостью $34,967,517,33 $175,002,81 $592,385.71
Warehouse $38,726,913,48 $331,169,64 $932,521,23

Чтобы создать таблицу, которая визуально суммирует столбцы, но для итогов строк возвращает истинное общее значение всех [Категория], необходимо выпустить следующий запрос:

select [Category].members on 0,  
[Business Type].members on 1  
from NON VISUAL (Select {[Category].Accessories, [Category].Clothing} on 0  
from ( Select {[Business Type].[Value Added Reseller], [Business Type].[Warehouse]} on 0  
from [Adventure Works])  
)  
where [Measures].[Reseller Sales Amount]  

Обратите внимание, что НЕ ВИЗУАЛЬНОЕ применяется только к [категории].

Приведенный выше запрос приводит к следующим результатам:

Тип бизнеса + Категория Все продукты Аксессуары Clothing
Все реселлеры $73,694,430,80 $506,172,45 $1,524,906,93
Добавленный торговый посредник по значению $34,967,517,33 $175,002,81 $592,385.71
Склад $38,726,913,48 $331,169,64 $932,521,23

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

Следующий пример демонстрирует, как использовать вычисленные элементы в подвыборах для фильтрации по ним. Чтобы воспроизвести этот образец, соединение должно быть установлено с помощью строка подключения parameter subqueries =1.

select Measures.allmembers on 0  
from (  
Select { [Measures].[Reseller Sales Amount]  
, [Measures].[Reseller Total Product Cost]  
, [Measures].[Reseller Gross Profit]  
, [Measures].[Reseller Gross Profit Margin]  
} on 0  
from [Adventure Works]  
)  

Приведенный выше запрос приводит к следующим результатам:

Объем продаж реселлера Общая стоимость товара реселлером Валовая прибыль от реселлеров Валовая маржа прибыли реселлера
$80,450,596,98 $79,980,114.38 $470,482.60 0,58%