Многомерные выражения подсчитывают пары измерений «многие ко многим»

#sql-server #ssas #mdx

#sql-server #ssas #многомерное число

Вопрос:

В службах SQL Server Analysis Services я создал куб для анализа спортивных игр. Таблица фактов содержит информацию об игре, такую как Date, HomeTeamId, AwayTeamId, HomeTeamResult, AwayTeamResult и т.д.

Для двух команд (HomeTeamId и AwayTeamId) я создал отношение «многие ко многим», как описано здесь: https://learn.microsoft.com/en-us/sql/analysis-services/lesson-5-3-defining-a-many-to-many-relationship

В настоящее время я могу запрашивать игры, в которые играет команда, с помощью этого многомерного запроса:

 SELECT  { [Measures].[Game Count] } ON 0,
{[Team].[Team Id].[Team Id]} ON 1
FROM [Apps Swiss Ice Hockey]
  

это возвращает результат:

  --------- ------------ 
| Team Id | Game Count |
 --------- ------------ 
|    1    |     27     |
|    2    |     21     |
|    3    |     34     |
 --------- ------------ 
  

пока все хорошо.
Теперь я хочу создать запрос для анализа количества сыгранных игр для всех возможных командных пар. Результат должен выглядеть примерно так:

  ----------- ----------- ------------ 
| Team 1 Id | Team 2 Id | Game Count |
 ----------- ----------- ------------ 
|     1     |     2     |      7     |
|     1     |     3     |     20     |
|     2     |     3     |     14     |
 ----------- ----------- ------------ 
  

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

 SELECT  { [Measures].[Game Count] } ON 0,
{[Team].[Team Id].[Team Id]} * {[Team].[Team Id].[Team Id]} ON 1
FROM [Apps Swiss Ice Hockey]
  

но это приводит к ошибке:

Иерархия идентификаторов команды используется более одного раза в функции перекрестного соединения.

Возможно ли достичь описанного результата с помощью многомерного запроса?

Ответ №1:

Вы не можете перекрестно соединить одну и ту же иерархию, вы можете только создать другую иерархию (такую же, как существующая) того же измерения Team, и тогда вы сможете использовать функцию перекрестного соединения.

 Crossjoin(
    {[Team Dimension].[Team Hierarchy 1].members}
     ,{[Team Dimension].[Team Hierarchy 2].members}
    )
  

Комментарии:

1. Спасибо! выглядит многообещающе, теперь я могу перекрестно соединить измерение team, но в результате я всегда получаю одно и то же значение в столбцах «Идентификатор команды 1» и «Идентификатор команды 2». Есть ли что-нибудь еще, что мне нужно сделать?

2. Я думаю, вам следует создать одну иерархию над HomeTeamId и другую иерархию над AwayTeamId, а затем соединить их. Возможно, теперь обе иерархии просматривают один и тот же столбец (скажем, HomeTeamId), и у вас нет никакой другой комбинации, кроме комбинаций, где оба значения равны.