簡體   English   中英

SQL 服務器表格 Z20F35E630DAF3494DBFA4C3F6 (F28)

[英]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,好的

結果1,好的

這是正確的結果。 這里沒問題。

添加度量 LowestLevelButItem...

結果 2,出乎意料

結果 2,意外

現在,這不是我們想要的結果……我根本不希望在這個結果中看到“品牌 A”

它表明 D4 中顯示的度量已在與 D5 和 D6 不同的級別進行評估。

D5 和 D6 在項目級別進行評估,正如預期的那樣,而 D4 在更高級別進行評估,因為在項目級別沒有匹配的行......

現在,添加度量 LowestLevel

結果3,好的

結果3,好的

現在,我明白了這個結果。

因為 LowestLevel 總是返回一個值,所以它使 Brand A / Item 1 可見,這會強制在 Item 級別評估度量 LowestLevelButItem,因此為 blank()。

我遇到的問題是第二個結果......

問題

如果下面沒有合適的物品,我怎么能強制 Pivot 桌子不退回品牌?

SSMS 行為

如果我在 SSMS 中瀏覽我的多維數據集,我會得到我期望的結果,即我的度量始終只在葉級別進行評估,並且除非它們具有葉級別成員,否則不會返回行。

SSMS 結果 1,相同

SSMS 結果 1

SSMS 結果 2

SSMS 結果 2,與 Excel 不同

SSMS 沒有返回沒有項目成員的“品牌 A”行

SSMS 結果 3

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

  • 通過 SSMS(產生我想要的結果)

SSMS MDX

  • Excel MDX

Excel 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM