Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Выражения подзапросов выборки являются вложенными выражениями SELECT, которые используются для ограничения пространства куба, из которого вычисляется внешнее выражение SELECT. Подзапросы выборки позволяют определять новое пространство, в котором будут выполняться все вычисления.
Подзапросы выборки в примерах
Начнем с примера того, как подзапросы выборки могут помочь сформировать результаты, которые нам требуется отобразить. Предположим, требуется сформировать таблицу, отражающую динамику продаж за несколько лет по 10 самым популярным продуктам.
Полученный результат должен иметь следующий вид.
|
Sum of Years |
Year 1 |
... |
Sum of Top 10 Products |
|
|
|
Product A |
|
|
|
... |
|
|
|
Для получения подобного результата можно было бы написать следующее многомерное выражение:
SELECT [Date].[Calendar Year].MEMBERS on 0
, TOPCOUNT( [Product].[Product].MEMBERS
, 10
, [Measures].[Sales Amount]
) ON 1
FROM [Adventure Works]
Оно возвращает следующие результаты.
|
All Periods |
CY 2005 |
CY 20062 |
CY 2007 |
CY 2008 |
Все продукты |
$80,450,596.98 |
$8,065,435.31 |
$24,144,429.65 |
$32,202,669.43 |
$16,038,062.60 |
Mountain-200 Black, 38 |
$1,634,647.94 |
(null) |
(null) |
$894,207.97 |
$740,439.97 |
Mountain-200 Black, 42 |
$1,285,524.65 |
(null) |
(null) |
$722,137.65 |
$563,387.00 |
Mountain-200 Silver, 38 |
$1,181,945.82 |
(null) |
(null) |
$634,600.78 |
$547,345.03 |
Mountain-200 Black, 46 |
$995,927.43 |
(null) |
(null) |
$514,995.76 |
$480,931.68 |
Mountain-200 Silver, 42 |
$1,005,111.77 |
(null) |
(null) |
$529,543.29 |
$475,568.49 |
Mountain-200 Silver, 46 |
$975,932.56 |
(null) |
(null) |
$526,759.30 |
$449,173.26 |
Road-150 Red, 56 |
$792,228.98 |
$382,159.24 |
$410,069.74 |
(null) |
(null) |
Mountain-200 Black, 38 |
$1,471,078.72 |
(null) |
$789,958.49 |
$681,120.23 |
(null) |
Road-350-W Yellow, 48 |
$1,380,253.88 |
(null) |
(null) |
$744,988.37 |
$635,265.50 |
Это очень близко к тому, что нам нужно, за исключением того, что запрос возвратил 9 продуктов, а не 10 и что итог «Все продукты» отражает сумму по всем продуктам, а не сумму по возвращенным 9 (в данном случае) самым популярным. Еще одна попытка решить проблему представлена в следующем многомерном запросе:
SELECT [Date].[Calendar Year].MEMBERS on 0
, TOPCOUNT( [Product].[Product].CHILDREN, 10, [Measures].[Sales Amount]) ON 1
FROM [Adventure Works]
Оно возвращает следующие результаты.
|
All Periods |
CY 2005 |
CY 2006 |
CY 2007 |
CY 2008 |
Mountain-200 Black, 38 |
$1,634,647.94 |
(null) |
(null) |
$894,207.97 |
$740,439.97 |
Mountain-200 Black, 42 |
$1,285,524.65 |
(null) |
(null) |
$722,137.65 |
$563,387.00 |
Mountain-200 Silver, 38 |
$1,181,945.82 |
(null) |
(null) |
$634,600.78 |
$547,345.03 |
Mountain-200 Black, 46 |
$995,927.43 |
(null) |
(null) |
$514,995.76 |
$480,931.68 |
Mountain-200 Silver, 42 |
$1,005,111.77 |
(null) |
(null) |
$529,543.29 |
$475,568.49 |
Mountain-200 Silver, 46 |
$975,932.56 |
(null) |
(null) |
$526,759.30 |
$449,173.26 |
Road-150 Red, 56 |
$792,228.98 |
$382,159.24 |
$410,069.74 |
(null) |
(null) |
Mountain-200 Black, 38 |
$1,471,078.72 |
(null) |
$789,958.49 |
$681,120.23 |
(null) |
Road-350-W Yellow, 48 |
$1,380,253.88 |
(null) |
(null) |
$744,988.37 |
$635,265.50 |
Road-150 Red, 62 |
$566,797.97 |
$234,018.86 |
$332,779.11 |
(null) |
(null) |
Это было очень близко к желаемому результату, поскольку отсутствует только сумма по продуктам. На данном этапе можно было бы начать корректировать приведенное выше многомерное выражение таким образом, чтобы недостающая строка возвращалась, однако решение этой задачи может оказаться довольно громоздким.
Еще один подход к данной проблеме — попробовать переопределить пространство куба, в котором вычисляется многомерное выражение. Что если «новый» куб содержал бы только данные по 10 самым популярным продуктам? В таком кубе все элементы соответствовали бы только этим 10 популярным продуктам, и задачу тогда решил бы простой запрос.
В приведенном ниже многомерном выражении используется инструкция подзапроса выборки, переопределяющая пространство куба под 10 продуктов и формирующая следующий результат.
SELECT [Date].[Calendar Year].MEMBERS on 0
, [Product].[Product].MEMBERS on 1
FROM (SELECT TOPCOUNT( [Product].[Product].CHILDREN
, 10
, [Measures].[Sales Amount]
) ON 0
FROM [Adventure Works]
)
WHERE [Measures].[Sales Amount]
Приведенное выше выражение возвратит следующие результаты.
|
All Periods |
CY 2005 |
CY 2006 |
CY 2007 |
CY 2008 |
Все продукты |
$19,997,183.30 |
$1,696,815.63 |
$2,816,611.28 |
$7,930,797.72 |
$7,552,958.66 |
Mountain-200 Silver, 38 |
$2,160,981.60 |
(null) |
(null) |
$1,024,359.10 |
$1,136,622.49 |
Mountain-200 Silver, 42 |
$1,914,547.85 |
(null) |
(null) |
$903,061.68 |
$1,011,486.18 |
Mountain-200 Silver, 46 |
$1,906,248.55 |
(null) |
(null) |
$877,077.79 |
$1,029,170.76 |
Mountain-200 Black, 38 |
$1,811,229.02 |
(null) |
$896,511.60 |
$914,717.43 |
(null) |
Mountain-200 Black, 38 |
$2,589,363.78 |
(null) |
(null) |
$1,261,406.37 |
$1,327,957.41 |
Mountain-200 Black, 42 |
$2,265,485.38 |
(null) |
(null) |
$1,126,055.89 |
$1,139,429.49 |
Mountain-200 Black, 46 |
$1,957,528.24 |
(null) |
(null) |
$946,453.88 |
$1,011,074.37 |
Road-150 Red, 62 |
$1,769,096.69 |
$828,011.68 |
$941,085.01 |
(null) |
(null) |
Road-150 Red, 56 |
$1,847,818.63 |
$868,803.96 |
$979,014.67 |
(null) |
(null) |
Road-350-W Yellow, 48 |
$1,774,883.56 |
(null) |
(null) |
$877,665.59 |
$897,217.96 |
Приведенные выше результаты в точности соответствуют требованию.
Рассмотрим, что именно сделал подзапрос выборки для получения этого результата. Он возвратил новый куб, содержащий все другие измерения для продукта «как есть», но в измерении самого продукта он отфильтровал все элементы таким образом, чтобы остались только 10 самых популярных продуктов, которые нас интересовали. Практически мы убрали все данные, которые не соответствовали критерию «10 самых популярных» и перестроили куб. В данном примере важно отметить еще один момент: 10 самых популярных продуктов вычислялись по всем элементам и всем измерениям в кубе. Это верно, поскольку в подзапросе выборки не было никаких иных ограничений фильтра.
Подзапросы выборки могут быть сложными настолько, насколько это необходимо. Следующий пример иллюстрирует формирование таблицы, аналогичной приведенной выше, но с фильтром «France» в измерении «Sales Territory» и «Internet» в измерении «Sales Channel».
SELECT [Date].[Calendar Year].MEMBERS on 0
, [Product].[Product].MEMBERS on 1
FROM (SELECT TOPCOUNT( [Product].[Product].CHILDREN
, 10
, [Measures].[Sales Amount]
) ON 0
, [Sales Territory].[Sales Territory].[Region].[France] on 1
, [Sales Channel].[Sales Channel].[Internet] on 2
FROM [Adventure Works]
)
WHERE [Measures].[Sales Amount]
Выданы следующие результаты.
|
All Periods |
CY 2005 |
CY 2006 |
CY 2007 |
CY 2008 |
Все продукты |
$748,682.49 |
$32,204.43 |
$73,125.18 |
$269,506.56 |
$373,846.32 |
Mountain-200 Silver, 38 |
$90,479.61 |
(null) |
(null) |
$41,759.82 |
$48,719.79 |
Mountain-200 Silver, 42 |
$97,439.58 |
(null) |
(null) |
$39,439.83 |
$57,999.75 |
Mountain-200 Silver, 46 |
$102,079.56 |
(null) |
(null) |
$27,839.88 |
$74,239.68 |
Mountain-200 Black, 38 |
$26,638.28 |
(null) |
$12,294.59 |
$14,343.69 |
(null) |
Mountain-200 Black, 38 |
$96,389.58 |
(null) |
(null) |
$41,309.82 |
$55,079.76 |
Mountain-200 Black, 42 |
$80,324.65 |
(null) |
(null) |
$43,604.81 |
$36,719.84 |
Mountain-200 Black, 46 |
$107,864.53 |
(null) |
(null) |
$45,899.80 |
$61,964.73 |
Road-150 Red, 62 |
$46,517.51 |
$14,313.08 |
$32,204.43 |
(null) |
(null) |
Road-150 Red, 56 |
$46,517.51 |
$17,891.35 |
$28,626.16 |
(null) |
(null) |
Road-350-W Yellow, 48 |
$54,431.68 |
(null) |
(null) |
$15,308.91 |
$39,122.77 |
Приведенные выше результаты — это 10 самых популярных продуктов, проданных во Франции через Интернет.
Инструкция подзапроса выборки
Имя участника-службы для подзапроса выборки:
[WITH [<calc-clause> ...]]
SELECT [<axis-spec> [, <axis-spec> ...]]
FROM [<identifier> | (< sub-select-statement >)]
[WHERE <slicer>]
[[CELL] PROPERTIES <cellprop> [, <cellprop> ...]]
< sub-select-statement > :=
SELECT [<axis-spec> [, <axis-spec> ...]]
FROM [<identifier> | (< sub-select-statement >)]
[WHERE <slicer>]
Подзапрос выборки представляет собой еще одну инструкцию Select, где определения оси и среза фильтруют пространство куба, для которого вычисляется внешнее выражение SELECT.
Если элемент указан в одной из осей или предложении среза, то данный элемент с его предками и потомками включается в подпространство куба для подзапроса выборки; все элементы с общим родителем, не указанные в предложении оси или среза, вместе с их потомками отфильтровываются из подпространства. Таким образом, пространство внешней операции выбора ограничивается существующими элементами в предложении оси или среза вместе с предками и потомками, как упоминалось выше.
Поскольку элемент «Все» всех неупомянутых измерений в предложении оси или среза принадлежат к пространству выбора, то все потомки элемента «Все» в этих измерениях также включаются в пространство подзапроса выборки.
Элемент «Все» во всех измерениях в пространстве вложенного куба вычисляется повторно, что отражает ограничения нового пространства.
Это иллюстрируется в приведенном ниже примере: первое многомерное выражение помогает отобразить неотфильтрованные значения куба, второе — иллюстрирует эффект применения фильтра в предложении подзапроса выборки.
SELECT { [Customer].[Customer Geography].[All Customers]
, [Customer].[Customer Geography].[Country].&[United States]
, [Customer].[Customer Geography].[State-Province].&[OR]&[US]
, [Customer].[Customer Geography].[City].&[Portland]&[OR]
, [Customer].[Customer Geography].[State-Province].&[WA]&[US]
, [Customer].[Customer Geography].[City].&[Seattle]&[WA]
} ON 1
, {[Measures].[Internet Sales Amount], [Measures].[Reseller Sales Amount]} ON 0
FROM [Adventure Works]
Возвращает следующие значения:
|
Internet Sales Amount |
Reseller Sales Amount |
All Customers |
$29,358,677.22 |
$80,450,596.98 |
United States |
$9,389,789.51 |
$80,450,596.98 |
Орегон |
$1,170,991.54 |
$80,450,596.98 |
Portland |
$110,649.54 |
$80,450,596.98 |
Вашингтон |
$2,467,248.34 |
$80,450,596.98 |
Seattle |
$75,164.86 |
$80,450,596.98 |
В приведенном выше примере «Seattle» является дочерним для «Washington», «Portland» — для «Орегона», «Oregon» и «Washington» — дочерние для «United States», а «United States» — для [Customer Geography].[All Customers]. У всех отображаемых в этом примере элементов имеются другие одноуровневые элементы, влияющие на значение статистического выражения родительского элемента, например Spokane, Tacoma и Everett — это одноуровневые элементы для Seattle и все они влияют на сумму продаж через Интернет для Washington. Значение Reseller Sales Amount не зависит от атрибута «Customer Geography», поэтому в результатах отображается значение «Все». Следующее многомерное выражение иллюстрирует влияние фильтра на предложение подзапроса выборки.
SELECT { [Customer].[Customer Geography].[All Customers]
, [Customer].[Customer Geography].[Country].&[United States]
, [Customer].[Customer Geography].[State-Province].&[OR]&[US]
, [Customer].[Customer Geography].[City].&[Portland]&[OR]
, [Customer].[Customer Geography].[State-Province].&[WA]&[US]
, [Customer].[Customer Geography].[City].&[Seattle]&[WA]
} ON 1
, {[Measures].[Internet Sales Amount], [Measures].[Reseller Sales Amount]} ON 0
FROM ( SELECT [Customer].[State-Province].&[WA]&[US] ON 0
FROM [Adventure Works]
)
Возвращает следующие значения:
|
Internet Sales Amount |
Reseller Sales Amount |
All Customers |
$2,467,248.34 |
$80,450,596.98 |
United States |
$2,467,248.34 |
$80,450,596.98 |
Вашингтон |
$2,467,248.34 |
$80,450,596.98 |
Seattle |
$75,164.86 |
$80,450,596.98 |
Приведенные выше результаты показывают, что только предки и потомки штата Вашингтон входят в подпространство, по которому вычислялась внешняя инструкция SELECT. Орегон и Портленд были удалены из вложенного куба, поскольку Орегон и все другие штаты, имеющие общего родителя, не были упомянуты в подзапросе выборки, тогда как Вашингтон был.
Элемент «Все» отразил фильтрацию по штату Вашингтон, причем не только в измерении [Customer Geography], но также и в других измерениях, пересекающихся с [Customer Geography]. Все измерения, не пересекающиеся с [Customer Geography], остаются во вложенном кубе без изменений.
Приведенные ниже многомерные выражения иллюстрируют, каким образом элемент «Все» в других измерениях отражает фильтрацию в подзапросе выборки. Первый запрос отображает результаты без изменений, а второй показывает действие фильтра:
SELECT { [Customer].[Customer Geography].[All Customers]
, [Customer].[Customer Geography].[Country].&[United States]
, [Customer].[Customer Geography].[State-Province].&[OR]&[US]
, [Customer].[Customer Geography].[City].&[Portland]&[OR]
, [Customer].[Customer Geography].[State-Province].&[WA]&[US]
, [Customer].[Customer Geography].[City].&[Seattle]&[WA]
} ON 1
, [Product].[Product Line].MEMBERS ON 0
FROM [Adventure Works]
WHERE [Measures].[Internet Sales Amount]
|
Все продукты |
Accessory |
Components |
Mountain |
Road |
Touring |
All Customers |
$29,358,677.22 |
$604,053.30 |
(null) |
$10,251,183.52 |
$14,624,108.58 |
$3,879,331.82 |
United States |
$9,389,789.51 |
$217,168.79 |
(null) |
$3,547,956.78 |
$4,322,438.41 |
$1,302,225.54 |
Орегон |
$1,170,991.54 |
$30,513.17 |
(null) |
$443,607.98 |
$565,372.10 |
$131,498.29 |
Portland |
$110,649.54 |
$2,834.17 |
(null) |
$47,099.91 |
$53,917.17 |
$6,798.29 |
Вашингтон |
$2,467,248.34 |
$62,662.92 |
(null) |
$945,219.38 |
$1,155,880.07 |
$303,485.97 |
Сиэтл |
$75,164.86 |
$2,695.74 |
(null) |
$19,914.53 |
$44,820.06 |
$7,734.54 |
SELECT { [Customer].[Customer Geography].[All Customers]
, [Customer].[Customer Geography].[Country].&[United States]
, [Customer].[Customer Geography].[State-Province].&[OR]&[US]
, [Customer].[Customer Geography].[City].&[Portland]&[OR]
, [Customer].[Customer Geography].[State-Province].&[WA]&[US]
, [Customer].[Customer Geography].[City].&[Seattle]&[WA]
} ON 1
, [Product].[Product Line].MEMBERS ON 0
FROM ( SELECT [Customer].[State-Province].&[WA]&[US] ON 0
FROM [Adventure Works]
)
WHERE [Measures].[Internet Sales Amount]
|
Все продукты |
Accessory |
Components |
Mountain |
Road |
Touring |
All Customers |
$2,467,248.34 |
$62,662.92 |
(null) |
$945,219.38 |
$1,155,880.07 |
$303,485.97 |
United States |
$2,467,248.34 |
$62,662.92 |
(null) |
$945,219.38 |
$1,155,880.07 |
$303,485.97 |
Вашингтон |
$2,467,248.34 |
$62,662.92 |
(null) |
$945,219.38 |
$1,155,880.07 |
$303,485.97 |
Сиэтл |
$75,164.86 |
$2,695.74 |
(null) |
$19,914.53 |
$44,820.06 |
$7,734.54 |
В приведенном выше результате видим, что значения All Products скорректированы и отражают только данные по штату Вашингтон, как и предполагалось.
Подзапросы выборки могут быть вложенными, глубина вложенности может быть любой и ограничена только доступной памятью. Самый внутренний подзапрос выборки определяет начальное подпространство, к которому применяется фильтр, передаваемый затем соседней внешней операции выбора. Здесь важно отметить тот факт, что вложение не является коммутативной операцией, поэтому порядок вложенности может влиять на результаты. В приведенном ниже примере показаны различия в зависимости от порядка вложенности.
SELECT [Sales Territory].[Sales Territory Region].MEMBERS on 0
, [Product].[Product].MEMBERS on 1
FROM (SELECT TOPCOUNT( [Product].[Product].CHILDREN, 5, [Measures].[Sales Amount]) ON 0
FROM (SELECT TOPCOUNT( [Sales Territory].[Sales Territory Region].CHILDREN, 5, [Measures].[Sales Amount]) on 0
FROM [Adventure Works]
)
)
WHERE [Measures].[Sales Amount]
Возвращены следующие результаты.
|
All Sales Territories |
Australia |
Canada |
Central |
Northwest |
Southwest |
Все продукты |
$7,591,495.49 |
$1,281,059.99 |
$1,547,298.12 |
$600,205.79 |
$1,924,763.50 |
$2,238,168.08 |
Mountain-200 Silver, 38 |
$1,449,576.15 |
$248,702.93 |
$275,052.45 |
$141,103.65 |
$349,487.01 |
$435,230.12 |
Mountain-200 Black, 38 |
$1,722,896.50 |
$218,024.05 |
$418,726.43 |
$123,929.46 |
$486,694.63 |
$475,521.93 |
Mountain-200 Black, 42 |
$1,573,655.14 |
$239,137.96 |
$319,921.61 |
$130,102.75 |
$420,445.84 |
$464,046.98 |
Mountain-200 Black, 46 |
$1,420,500.58 |
$192,320.16 |
$230,875.99 |
$117,044.49 |
$424,813.66 |
$455,446.27 |
Road-150 Red, 56 |
$1,424,867.11 |
$382,874.89 |
$302,721.64 |
$88,025.44 |
$243,322.36 |
$407,922.78 |
SELECT [Sales Territory].[Sales Territory Region].MEMBERS on 0
, [Product].[Product].MEMBERS on 1
FROM (SELECT TOPCOUNT( [Sales Territory].[Sales Territory Region].CHILDREN, 5, [Measures].[Sales Amount]) ON 0
FROM (SELECT TOPCOUNT( [Product].[Product].CHILDREN, 5, [Measures].[Sales Amount]) on 0
FROM [Adventure Works]
)
)
WHERE [Measures].[Sales Amount]
Возвращены следующие результаты.
|
All Sales Territories |
Australia |
Canada |
Northwest |
Southwest |
United Kingdom |
Все продукты |
$7,938,218.56 |
$1,096,312.24 |
$1,474,255.49 |
$2,042,674.72 |
$2,238,099.55 |
$1,086,876.56 |
Mountain-200 Silver, 38 |
$1,520,958.53 |
$248,702.93 |
$275,052.45 |
$349,487.01 |
$435,230.12 |
$212,486.03 |
Mountain-200 Silver, 42 |
$1,392,237.14 |
$198,127.15 |
$229,679.01 |
$361,233.58 |
$407,854.24 |
$195,343.16 |
Mountain-200 Black, 38 |
$1,861,703.23 |
$218,024.05 |
$418,726.43 |
$486,694.63 |
$475,521.93 |
$262,736.19 |
Mountain-200 Black, 42 |
$1,702,427.25 |
$239,137.96 |
$319,921.61 |
$420,445.84 |
$464,046.98 |
$258,874.87 |
Mountain-200 Black, 46 |
$1,460,892.41 |
$192,320.16 |
$230,875.99 |
$424,813.66 |
$455,446.27 |
$157,436.31 |
Очевидно, между двумя наборами результатов есть различия. Первый запрос ответил на вопрос, каковы пять наиболее популярных продуктов в пяти наиболее успешных регионах, а второй запрос — где лучше всего продаются пять наиболее популярных продуктов.
Замечания
Для подзапросов выборки действуют следующие ограничения.
Предложение WHERE не фильтрует подпространство.
Предложение WHERE изменяет элемент по умолчанию только во вложенном кубе.
Предложение NON EMPTY нельзя использовать в предложении оси, вместо него следует использовать выражение функции NonEmpty (многомерные выражения).
Предложение HAVING нельзя использовать в предложении оси, вместо него следует использовать выражение функции Filter (многомерные выражения).
По умолчанию в подзапросах выборки запрещены вычисляемые элементы, однако это ограничение можно изменить по сеансам путем присвоения значения свойству строки подключения SubQueries в свойстве ConnectionString или DBPROP_MSMD_SUBQUERIES в Поддерживаемые свойства XML для аналитики (XMLA). Дополнительные сведения о поведении вычисляемых элементов в зависимости от значений свойства SubQueries или DBPROP_MSMD_SUBQUERIES см. в разделе Вычисляемые элементы в подзапросах выборки и вложенных кубах.