我在 SQL Server 2008 服务器上设置了 SSAS 数据库。我为一组用户设置了一个角色,我希望能够访问该数据库中的多维数据集。无论它说什么,我都设置了“读取定义”和“读取访问”,但这似乎不起作用。
用户可以打开我之前设置的数据透视表,但不会显示任何时间,但维度数据会显示得很好(用户、部门等)。
然后我设置了一个个人用户并给了他们完全控制权(管理员),效果很好。我缺少什么可以让他们正确访问多维数据集?进程数据库?还有什么?
我想使用 SQL 代理作业(这很可能涉及执行 SSIS 包)动态备份给定 SSAS 实例上的所有数据库。这是一个动态过程,这一点势在必行——如果用户添加数据库或多维数据集,我想一次性设置一项可以自动检测所有现有 SSAS 元数据的作业。
不幸的是,我没有看到任何东西告诉我如何以干净的方式自动和动态地备份 SSAS 实例上的所有数据库。“干净”,我的意思是:
DatabaseId备份命令,不是的DatabaseName。有时可以有之间的差异DatabaseName和DatabaseId,如果有是有差别,如果备份将无法DatabaseName代替的使用DatabaseId。仅查询目录架构不会给我DatabaseId.我需要比较不同商店自开业以来每周和每月的交易次数。问题是这些商店的开业日期不同。
所以,这个想法是比较前几周或几个月的交易数量
这就是我所拥有的:
Canal Key 1
Recount FactTransactions
Month1-2015 Month2-2015 Month3-2015 Month4-2015 Month5-2015 Month6-2015
Type of store Cod Store
Spain
2 Store 1 5 6 10
Store 2 10 20 40 50 60 85
4
Store 3 31 45 100 315 441 625
Store 4 10 20 32 45
Portugal
1
Store 5 12
Run Code Online (Sandbox Code Playgroud)
这就是我想要获得的(比较自开业之日起的不同商店):
Canal Key 1
Recount FactTransactions
Month1 (or Week) Month2 Month3 Month4 Month5 Month6
Type of store Cod Store
Spain
2 Store 1 5 6 10 …Run Code Online (Sandbox Code Playgroud) 我有一个包含来自零售业务的库存盘点数据的多维数据集。它有 2 个度量组 - 一个包含在每个盘点批次中计算的库存单位数(与产品、批次和时间维度相关),另一个包含产品价格(仅与产品维度相关)。
price 度量组中的度量使用 Min 和 Max 运算符(即它们显示 Products 维度的选定成员的最低或最高价格)。
我似乎已经正确配置了多维数据集和维度(价格度量按预期显示)......除了以下情况:
如果我在 Excel 中查询多维数据集并按时间和批次获取单位,我会看到预期的结果(见下图,按时间 = 2015 过滤,并隐藏没有数据的行),即仅包含所选单位事实数据的批次时间维度成员。
如果我现在添加一个价格度量(不更改任何过滤器),Units total 不变(如预期),但我现在可以看到Batch 维度中的每个成员(见下图)。这对最终用户来说是一个问题,因为他们只想查看先前选择的批次中产品的价格。
从技术角度来看,这是有道理的 - 价格事实与时间无关,因此不能像单位那样被我的时间过滤器过滤。
我可以做些什么(在多维数据集设计或 Excel 中)消除给定过滤器没有单位的 Batch 成员?注意:我无法让用户编写 MDX 查询 - 报告构建需要保持“点击”!
编辑 27/1(添加额外的屏幕截图以说明根据 TomV 的回答设置 Ignore Unrelated Dimensions = False 的奇怪副作用)
我有一个类似的查询
SELECT column1, column2 FROM OPENQUERY(AnalysisServerName, 'MDX QUERY ...').
Run Code Online (Sandbox Code Playgroud)
它位于存储过程中。MDX 查询是动态内置的,查询的长度远远超过 8000 个字符(最多可以达到 400 000 个符号)。
MDX 查询返回大约 200 列,我只需要其中的一些。由于尺寸复杂,我无法减少数量。
因此,我必须将结果写入临时表或直接将SELECT它们作为程序的结果。我决定给SELECT他们。但是,当我尝试使用 省略 8000 个字符的限制时EXEC OPENQUERY(AnalysisServerName, 'MDX QUERY ...') AT AnalysisServerName,我无法SELECT甚至将它们保存到临时表中,因为它发生在存储过程内部并且不允许嵌套(遵循此线程)。
我希望我能做到
SELECT column1, column2 FROM (EXEC OPENQUERY(AnalysisServerName, 'MDX Query') AT AnalysisServerName)
Run Code Online (Sandbox Code Playgroud)
即使我可以直接在分析服务器上执行很长的 MDX 查询
DECLARE @myStatement VARCHAR(MAX)
SET @myStatement = 'OPENQUERY(AnalysisServerName, 'MDX Query')'
EXECUTE (@myStatement) AT AnalysisServerName
Run Code Online (Sandbox Code Playgroud)
我无法对存储过程中的结果做任何事情,因为
DECLARE @myStatement VARCHAR(MAX)
SET @myStatement = 'SELECT column1, column2 FROM OPENQUERY(AnalysisServerName, 'MDX …Run Code Online (Sandbox Code Playgroud) 这是我的布局的示例图片。

如您所见,我有我的 SCD 类型(状态/开始日期/结束日期/businesskey)。
我的密钥是标识每条记录的代理密钥。
我的问题是我的层次结构似乎出错了,这可能是由于布局不正确。这是我当前的关键列结构。
等级制度
LineOfBusinessId(关键列:LineOfBusinessId)(名称列:LineOfBusinessName)
WorkerDivisionId(关键列:LineOfBusinessId、WorkerDivisionId)(名称列:WorkerDivisionName)
WorkerId(关键列:LineOfBusinessId、WorkerDivisionId、WorkerId)(名称列:WorkerName)
此维度出错是因为工作人员名称发生更改,并且在完整处理期间发生 select distinct 时,它会发现重复项。我只是想知道针对这种特定情况设置键列的最佳方法是什么。名称是否需要成为关键列的一部分,或者我的层次结构完全不正确。我确信我的设置是正确的,但我现在显然在质疑自己。
我收到了一些建议,在这种情况下最好的做法是使用代理键作为我的键列的一部分,但后来发现这会导致问题,因为我只希望在查询我的 SCD 时显示一条记录。后来,我收到了更多建议,说我不应该在 id 键列中使用代理,而应该在名称键列中使用代理,特别是在 Worker 级别。
在没有听到建立这种类型层次结构的人的意见的情况下,我对使用此设置更新所有多维数据集感到相当不安。当我看到这个设置时,我不得不认为其他人已经建立了这种类型的层次结构,因为它相当简单。非常感谢任何关于此的建议/方向。
谢谢。
我有一个 55 GB 大小的立方体,需要大约 2 小时才能完成处理。因为我有过去 4 年的数据,但我们的业务只需要 2 年的数据。为此,我已将维度和事实视图更改为仅包含最近两年的数据。现在,我的立方体大小减少到 32 GB,但处理时间增加了 30 分钟(即 2 小时 30 分钟)。我期望它会更少,因为我限制了进入多维数据集的大量数据。为什么处理时间增加了而实际上应该减少?我现在怎样才能减少处理时间?
PS:我已经尝试过多维数据集分区,并且由于尺寸较大,它也增加了处理时间。
我正在使用通过 WHERE 子句限制数据的视图。
我的观点基本上是这样的:
SELECT V.Col1, V.Col2.... V.Col13
FROM DimeTable V
WHERE <my filter clause>
Run Code Online (Sandbox Code Playgroud)
它从维度表中选择几乎所有列,因此我无法在所有这些列上创建非聚集索引,因为它可能会减慢插入操作并且对我没有太大帮助
我有一个 Dim 表,名为DimAccounts. 它描述了一个用户帐户和该帐户的创建日期。例如:
我想动态获取过去 6 个月内创建的帐户列表。例如今天是 09\01\2016。所以我的帐户列表将是从01-08-2015直到创建的帐户09-01-2016。请注意,此CreatedOn字段没有层次结构,它是帐户维度的一个属性。
我们有一个事实表,其中包含卡车/司机/天运输的重量。
以及每辆卡车最大重量的尺寸。
我们希望运输重量的百分比,所以我们从
create MEMBER CURRENTCUBE.[Measures].[% WT]
AS [Measures].[Weight]/[Dim Truck].[Max_weight].currentmember.properties("key"),
FORMAT_STRING = "Percent";
Run Code Online (Sandbox Code Playgroud)
这仅适用于一辆卡车在特定日期和司机只有一片叶子的个别行。
如果卡车一天行驶两次,而不是 sum(weight)/sum(max_weight) 或者如果您更喜欢 sum(weight)/(n*max_weight) 我们得到的是 sum(weight)/max_weight,则它不起作用
在任何聚合级别都会发生完全相同的情况。例如,月或年或总计。或者只是在卡车级别。
我们一直在玩各种公式和范围,但没有成功。
知道如何定义它以便聚合按预期工作吗?
我有一些列代表表格中的年龄,取值从 0 到 100,但也有 -1 表示“缺失值”。我不想将它们存储为字符串以便能够找到平均年龄等,但是 SSAS 默认将 0 变为 NULL,并且我也想将 -1 替换为 NULL,因此有经典的“重复属性键”错误。
是否有正确的方法/类型来处理年龄值?