Многомерные выражения: сумма, игнорируя элементы с повторяющимся именем

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

Каждая категория может иметь любое количество подкатегорий, и каждая подкатегория может иметь любое количество собственных подкатегорий, до пяти уровней подкатегорий. Количество подкатегорий может варьироваться.
Итак, category_hierarchy в category_dimension имеет следующие уровни:

main_category, sub_category_1, sub_category_2, ..., sub_category_5

и может выглядеть так:

id    main_category     sub_category_1    sub_category_2     sub_category_3   ...
1     Electronics
2     Electronics       Camera & Photo
3     Electronics       Camera & Photo    Accessories
4     Electronics       Camera & Photo    Digital Cameras
5     Electronics       Camera & Photo    Film Photography   Film Cameras
6     Electronics       Camera & Photo    Film Photography   Film
7     Electronics       Headphones
8     Home & Kitchen
...

В таблице фактов есть данные о продажах для каждого продукта в каждой категории за день, и каждый продукт может принадлежать более чем к одной категории (если продукт принадлежит более чем к одной категории, он имеет одинаковые объемы продаж в каждой из этих категорий), например.

id    product_id    category_id    date_id      sales   other_information
1     1             1              2016-06-30   4       AAA
2     1             2              2016-06-30   4       BBB
3     1             6              2016-06-30   4       CCC
4     2             2              2016-06-30   5       DDD
5     2             4              2016-06-30   5       EEE
...

Если я сейчас запущу простой запрос MDX, чтобы показать мне количество продаж для каждой категории, он будет суммировать количество продаж несколько раз, если продукт находится в нескольких категориях:

SELECT 
  {[DATE_DIMENSION].[DATE_HIERARCHY].ALLMEMBERS} ON COLUMNS
 ,NON EMPTY 
      {[CATEGORY_DIMENSION].[CATEGORY_HIERARCHY].ALLMEMBERS}
    * 
      {[PRODUCT_DIMENSION].[PRODUCT_HIERARCHY].ALLMEMBERS} ON ROWS
FROM [Cube]
WHERE [MEASURES].[SALES];

возвращается

                                             2016-06-30  2016-06-29  ...
CATEGORY                    PRODUCT_ID       SALES       SALES
All Categories              All Products     22          ...
                              1              12
                              2              10
  Electronics               All Products     22
                              1              12
                              2              10
    Camera & Photo          All Products     18
                              1               8
                              2              10
       Digital Cameras      All Products      5
                              2               5
       Film Photography     All Products      4
                              1               4
         Film               All Products      4
                              1               4

Я хотел бы всегда получать продажи 4 для продукта 1 и продажи 5 для продукта 2 2016-06-30 (но при этом иметь возможность суммировать продажи по неделям/месяцам/годам):

                                             2016-06-30  2016-06-29  ...
CATEGORY                    PRODUCT_ID       SALES       SALES
All Categories              All Products      9          ...
                              1               4
                              2               5
  Electronics               All Products      9
                              1               4
                              2               5
    Camera & Photo          All Products      9
                              1               4
                              2               5
       Digital Cameras      All Products      5
                              2               5
       Film Photography     All Products      4
                              1               4
         Film               All Products      4
                              1               4

person Christian Welsch    schedule 09.06.2016    source источник
comment
Что, если продажи для (ProductA/Subcategory 1) = 5 и (ProductA/Subcategory 2) = 3?   -  person whytheq    schedule 09.06.2016
comment
Продажи для (ProductA/Subcategory 1) всегда = (ProductA/Subcategory 2)   -  person Christian Welsch    schedule 09.06.2016
comment
Отредактировал вопрос, чтобы уточнить структуру категорий.   -  person Christian Welsch    schedule 04.07.2016


Ответы (1)


Это не закончено и не проверено - это только начальная идея: мне нужно будет протестировать AdvWrks, как только я получу к нему доступ.

Приспособить элемент All к вашим потребностям довольно сложно.

WITH 
SET [All_tuples] AS
    ORDER(
      {[CATEGORY_DIMENSION].[CATEGORY_HIERARCHY].[CATEGORY_HIERARCHY].MEMBERS}
    * {[PRODUCT_DIMENSION].[PRODUCT_HIERARCHY].MEMBERS}
    , [PRODUCT_DIMENSION].CURRENTMEMBER.MEMBER_CAPTION
    , BDESC
    )
SET [NoDupes] AS
  FILTER(
     [All_tuples] AS X,
     X.CURRENT.ITEM(1) NOT IS X.CURRENT.LAG(1).ITEM(1)
  )
MEMBER [CATEGORY_DIMENSION].[CATEGORY_HIERARCHY].[All].[Category I NEW] AS
  AGGREGATE(
    [NoDupes]
  ) 
SELECT 
  {[Measures].[Sales]} ON COLUMNS
 ,NON EMPTY 
   [CATEGORY_DIMENSION].[CATEGORY_HIERARCHY].[All].[Category I NEW] ON ROWS
FROM [Cube];
person whytheq    schedule 10.06.2016
comment
Это возвращает синтаксическую ошибку. Также не поможет добавление нового члена основной категории, потому что а) количество основных категорий не фиксировано и может меняться со временем и б) проблема уже может возникнуть на уровне подкатегории. Я расширил свой первоначальный вопрос, чтобы уточнить структуру категорий. - person Christian Welsch; 04.07.2016