我们将 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,好的
这是正确的结果。这里没问题。
添加度量 LowestLevelButItem...
结果 2,出乎意料
现在,这不是我们想要的结果……我根本不希望在这个结果中看到“品牌 A”
它表明 D4 中显示的度量已在与 D5 和 D6 不同的级别进行评估。
D5 和 D6 在项目级别进行评估,正如预期的那样,而 D4 在更高级别进行评估,因为在项目级别没有匹配的行......
现在,添加度量 LowestLevel
结果3,好的
现在,我明白了这个结果。
因为 LowestLevel 总是返回一个值,所以它使 Brand A / Item 1 可见,这会强制在 Item 级别评估度量 LowestLevelButItem,因此为 blank()。
我遇到的问题是第二个结果......
问题
如果下面没有合适的项目,我怎么能强制数据透视表不归还品牌?
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
- 通过 SSMS(产生我想要的结果)
- Excel MDX