[英]Unexpected Excel Pivot behaviour with SQL Server Tabular model (v2)
我們使用 Office 365 中的 Excel 和 SQL 服務器 2019 表格 model
關於從 DAX 請求計算的級別,我有 Excel Pivot 的“奇怪”行為。
我創建了 3 個簡單 (SQL Server) 表,MyDim、DimColour 和 MyFact
MyDim 表中的 BrandName 和 ItemName 之間存在隱式層次結構(未強制執行)。
我無法強制執行這一點,因為沒有任何東西可以說一件物品只能屬於一個品牌。
我創建了一個非常基本的度量來匯總事實,盡管我在這里並不需要它
FactTotal := SUM(MyFact[FactValue])
我還創建了 2 個更有趣的附加措施
LowestLevel :=
SWITCH (
TRUE (),
ISFILTERED ( 'MyDim'[ItemName] ), "Item",
ISFILTERED ( 'MyDim'[BrandName] ), "Brand",
"Neither Brand nor Item"
)
最低級別總是返回一個值,無論事實表中是否有行。
LowestLevelButItem :=
SWITCH (
TRUE (),
ISFILTERED ( 'MyDim'[ItemName] ), BLANK (),
ISFILTERED ( 'MyDim'[BrandName] ), "Brand",
"Neither Brand nor Item"
)
只要我們不過濾 ItemName,LowestLevelButItem 就會返回一個值
現在,這是困擾我們的行為......
在 Excel Pivot 表中打開立方體,過濾顏色藍色和黃色
結果1,好的
這是正確的結果。 這里沒問題。
添加度量 LowestLevelButItem...
結果 2,出乎意料
現在,這不是我們想要的結果……我根本不希望在這個結果中看到“品牌 A”
它表明 D4 中顯示的度量已在與 D5 和 D6 不同的級別進行評估。
D5 和 D6 在項目級別進行評估,正如預期的那樣,而 D4 在更高級別進行評估,因為在項目級別沒有匹配的行......
現在,添加度量 LowestLevel
結果3,好的
現在,我明白了這個結果。
因為 LowestLevel 總是返回一個值,所以它使 Brand A / Item 1 可見,這會強制在 Item 級別評估度量 LowestLevelButItem,因此為 blank()。
我遇到的問題是第二個結果......
問題
如果下面沒有合適的物品,我怎么能強制 Pivot 桌子不退回品牌?
SSMS 行為
如果我在 SSMS 中瀏覽我的多維數據集,我會得到我期望的結果,即我的度量始終只在葉級別進行評估,並且除非它們具有葉級別成員,否則不會返回行。
SSMS 結果 1,相同
SSMS 結果 2
SSMS 沒有返回沒有項目成員的“品牌 A”行
SSMS 結果 3
SQL 腳本重現
CREATE TABLE MyDim(MyDimId INT NOT NULL PRIMARY KEY
,BrandName VARCHAR(100) NOT NULL
,ItemName VARCHAR(100) NOT NULL
);
GO
-- TRUNCATE TABLE MyDim;
INSERT INTO MyDim(MyDimId, BrandName, ItemName)
VALUES(1, 'Brand A', 'Item 1')
,(2, 'Brand B', 'Item 2')
,(3, 'Brand B', 'Item 3');
GO
CREATE TABLE DimColour(Colour VARCHAR(100) NOT NULL PRIMARY KEY);
GO
INSERT INTO DimColour(Colour)
VALUES('Red')
, ('Blue')
, ('Yellow');
CREATE TABLE MyFact(MyDimId INT NOT NULL
,Colour VARCHAR(100) NOT NULL
,FactValue INT NOT NULL
,PRIMARY KEY(MyDimId, Colour)
);
GO
-- TRUNCATE TABLE MyFact;
INSERT INTO MyFact(MyDimId, Colour, FactValue)
VALUES(1, 'Red', 1)
, (2, 'Blue', 2)
, (3, 'Blue', 4)
, (3, 'Yellow', 8);
為結果 2 查詢生成的 MDX
只需將以下 IF 子句添加到您的度量中:
LowestLevelButItem :=
IF(
NOT(ISBLANK([FactTotal])),
SWITCH (
TRUE (),
ISFILTERED ( 'MyDim'[ItemName] ), BLANK (),
ISFILTERED ( 'MyDim'[BrandName] ), "Brand",
"Neither Brand nor Item"
)
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.