Подзапросы выборки в запросах

Выражения подзапросов выборки являются вложенными выражениями 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

All Products

$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

All Products

$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

All Products

$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

Oregon

$1,170,991.54

$80,450,596.98

Portland

$110,649.54

$80,450,596.98

Washington

$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]. Все элементы, показанные в данном примере, имеют другие элементы с общим родителем, влияющие на статистическое значение родителя, т. е. города Спокане, Такома и Эверетт имеют общего родителя с Сиэтлом и все они будут влиять на сумму для продаж через Интернет в штате Вашингтон. Значение 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

Washngton

$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]

 

All Products

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

Oregon

$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

Washington

$2,467,248.34

$62,662.92

(null)

$945,219.38

$1,155,880.07

$303,485.97

Seattle

$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]

 

All Products

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

Washington

$2,467,248.34

$62,662.92

(null)

$945,219.38

$1,155,880.07

$303,485.97

Seattle

$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

All Products

$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

All Products

$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

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

Примечания

Для подзапросов выборки действуют следующие ограничения.