0

我们将 Office 365 中的 Excel 与 SQL Server 2019 表格模型一起使用

关于从 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 数据透视表中打开多维数据集,过滤颜色蓝色和黄色

结果1,好的

结果1,好的

这是正确的结果。这里没问题。

添加度量 LowestLevelButItem...

结果 2,出乎意料

结果 2,意外

现在,这不是我们想要的结果……我根本不希望在这个结果中看到“品牌 A”

它表明 D4 中显示的度量已在与 D5 和 D6 不同的级别进行评估。

D5 和 D6 在项目级别进行评估,正如预期的那样,而 D4 在更高级别进行评估,因为在项目级别没有匹配的行......

现在,添加度量 LowestLevel

结果3,好的

结果3,好的

现在,我明白了这个结果。

因为 LowestLevel 总是返回一个值,所以它使 Brand A / Item 1 可见,这会强制在 Item 级别评估度量 LowestLevelButItem,因此为 blank()。

我遇到的问题是第二个结果......

问题

如果下面没有合适的项目,我怎么能强制数据透视表不归还品牌?

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

4

1 回答 1

1

只需将以下 IF 子句添加到您的度量中:

LowestLevelButItem :=
IF(
  NOT(ISBLANK([FactTotal])),
  SWITCH (
    TRUE (),
    ISFILTERED ( 'MyDim'[ItemName] ), BLANK (),
    ISFILTERED ( 'MyDim'[BrandName] ), "Brand",
    "Neither Brand nor Item"
  )
)
于 2021-12-23T12:52:51.737 回答