Скажем, у меня есть эта схема (извините за слегка запутанный пример):
CREATE TABLE Sales
(
ID INT PRIMARY KEY,
Shop NVARCHAR(MAX),
ShopLocationLeft NVARCHAR(MAX),
ShopLocationRight NVARCHAR(MAX),
Amount DECIMAL
)
INSERT INTO Sales VALUES
(1, 'Shop #1', 'New', 'York', 10000),
(2, 'Shop #2', 'New', 'Delhi', 1000),
(3, 'Shop #3', 'North', 'York', 5000)
Затем я создаю куб с Shop
измерением с 3 атрибутами :
Name
(столбец Shop
) Location Left
(столбец ShopLocationLeft
) Location Right
(столбец ShopLocationRight
))
Я могу исследовать куб вдоль этого измерения:
SELECT
[Amount] ON COLUMNS,
[Shop].[Name].Children ON ROWS
FROM
[Sales]
Чтобы получить:
Amount
Shop #1 10000
Shop #2 1000
Shop #3 5000
Пока все хорошо.
Но используя другие атрибуты , такие как Location Left
:
SELECT
[Amount] ON COLUMNS,
[Shop].[Location Left].Children ON ROWS
FROM
[Sales]
Мы получаем:
Amount
New 11000
North 5000
Таким образом, куб позволяет исследовать и агрегировать на 1 уровень глубже, чемизмерение, вдоль атрибутов, что делает их своего рода субразмерами .
Что в данном случае не имеет делового значения.
Я быложидая, что, как и SQL SELECT
, вместо этого будет отображаться столбец Location Left
:
Amount
New 10000
New 1000
North 5000
Потому что для меня это измерение имеет 3 точки:
('Shop #1', 'New', 'York')
('Shop #2', 'New', 'Delhi')
('Shop #3', 'North', 'York')
Что следует считать атомарными объектами, которые не могут быть разбиты дальше.
Я понимаю, что это поведение может быть полезным (например, для имени и фамилии), но в этом случае оно не имеет никакого смысла.
Или, если бы я определил иерархию n-уровней для атрибута (например, страна -> город -> местоположение), это тоже было бы логично, так как я бы явно попросил более глубокое исследованиеи агрегация.
Как предотвратить такое поведение, если оно приведет к несоответствующим результатам?