Ssas 如何在给定时间内创建或打开所有项目
我正在使用一个系统,因为项目已创建(Ssas 如何在给定时间内创建或打开所有项目,ssas,mdx,olap,Ssas,Mdx,Olap,我正在使用一个系统,因为项目已创建(postDatedimension)并已关闭(endDatedimension)。endDate列始终填充上次查看项目的时间。如果项目的最后一次查看日期早于您要查询的日期,则该项目在特定时间内被视为已关闭。事实表中的每一行都有项、postDate、endDate、locationID,以及用于聚合的一些其他维度。我试图完成的是在给定的时间范围内使所有项目保持活动状态。例如,我想知道2008年11月或2008年11月之前发布的所有尚未关闭的项目。在SQL中,它看
postDate
dimension)并已关闭(endDate
dimension)。endDate
列始终填充上次查看项目的时间。如果项目的最后一次查看日期早于您要查询的日期,则该项目在特定时间内被视为已关闭。事实表中的每一行都有项、postDate
、endDate
、locationID
,以及用于聚合的一些其他维度。我试图完成的是在给定的时间范围内使所有项目保持活动状态。例如,我想知道2008年11月或2008年11月之前发布的所有尚未关闭的项目。在SQL中,它看起来像:
SELECT C.geoCountyArea,TM.CalendarYear,COUNT(DISTINCT a.itemid)
FROM [dbo].[factTable] a
JOIN dbo.dimDate AS TM
ON TM.DateKey BETWEEN postDate AND endDate
JOIN [dbo].[dim_geography] C
ON A.geographyID=C.geographyID
WHERE C.geoCountyArea = '1204000057'
AND TM.CalendarYear = 2008 AND TM.MonthNumberOfYear = 11
GROUP BY C.geoCountyArea,TM.CalendarYear
ORDER BY C.geoCountyArea,TM.CalendarYear
这将返回预期的27715
。现在,在MDX中,这看起来像:
WITH MEMBER Measures.[itemCount] AS
AGGREGATE(
{NULL:[PostDate].[Month Name].&[2008]&[11]} * {[EndDate].[Month Name].&[2008]&[11]:NULL},
[Measures].[Fact_itemCount]
)
SELECT NON EMPTY (
Measures.[itemCount]
) ON 0,
NON EMPTY (
{[PostDate].[Month Name].&[2008]&[11]},
{[Geography].[Geo County Area].&[1204000057]}
)ON 1
FROM [Cube];
WITH MEMBER Measures.[itemCount] AS
AGGREGATE(
{NULL:LINKMEMBER([DATE].[Calendar].CURRENTMEMBER
,[PostDate].[Calendar])}
* {LINKMEMBER([DATE].[Calendar].CURRENTMEMBER
, [EndDate].[Calendar]):NULL}
, [Measures].[Fact_itemCount]
)
SELECT {Measures.[jobCount]} ON 0,
NON EMPTY (
{[DATE].[Month Name].&[2008]&[11]},
{[Geography].[Geo County Area].&[1204000057]}
)ON 1
FROM [Cube];
这将返回27717
——这比SQL版本多2个,这可能是由于没有发布结束日期的项目造成的。现在,当我想要得到不止一个明确的时间时,就会出现复杂的情况——例如,2008年所有月份的物品计数或所有年份的物品计数。我查找了通过滚动尺寸将给定参数链接到另一个参数的方法,并遇到了链接。我修改了脚本,使其看起来像:
WITH MEMBER Measures.[itemCount] AS
AGGREGATE(
{NULL:[PostDate].[Month Name].&[2008]&[11]} * {[EndDate].[Month Name].&[2008]&[11]:NULL},
[Measures].[Fact_itemCount]
)
SELECT NON EMPTY (
Measures.[itemCount]
) ON 0,
NON EMPTY (
{[PostDate].[Month Name].&[2008]&[11]},
{[Geography].[Geo County Area].&[1204000057]}
)ON 1
FROM [Cube];
WITH MEMBER Measures.[itemCount] AS
AGGREGATE(
{NULL:LINKMEMBER([DATE].[Calendar].CURRENTMEMBER
,[PostDate].[Calendar])}
* {LINKMEMBER([DATE].[Calendar].CURRENTMEMBER
, [EndDate].[Calendar]):NULL}
, [Measures].[Fact_itemCount]
)
SELECT {Measures.[jobCount]} ON 0,
NON EMPTY (
{[DATE].[Month Name].&[2008]&[11]},
{[Geography].[Geo County Area].&[1204000057]}
)ON 1
FROM [Cube];
但是,这只返回2008年11月创建的项目-值为14884
。如果我加上其他月份,我确实会得到每个月的单独计数,但同样,这些只是在这些月份创建的项目
如何获取给定月/年/季度的“活动”项目计数,而无需在
聚合中明确声明时间值?是否可以使用非空
WITH MEMBER Measures.[itemCount] AS
AGGREGATE(
{NULL:
NONEMPTY(
[PostDate].[Month Name].MEMBERS //<<AMEND TO EXACT STRUCTURE USED IN YOUR CUBE
,[DATE].[Calendar].CURRENTMEMBER
).ITEM(0).ITEM(0)}
* {NONEMPTY(
[EndDate].[Month Name].MEMBERS //<<AMEND TO EXACT STRUCTURE USED IN YOUR CUBE
,[DATE].[Calendar].CURRENTMEMBER
).ITEM(0).ITEM(0): NULL}
, [Measures].[Fact_itemCount]
)
...
成员度量值为[itemCount]的
合计(
{NULL:
非空(
[PostDate].[Month Name].MEMBERS/这是提供有效结果的解决方案(针对针对仓库表的SQL调用进行测试):
并不是说我在针对发布日期和结束日期执行LINKMEMBER
,而不是针对全局日期度量。这是在抛出一个错误:#错误查询(6,5)MEMBERS函数要求参数使用层次结构表达式。使用了一个成员表达式。
然后我修复了维度文本格式-现在它正在运行,但尚未完成(2分钟,正在计数)。@wergeld是否完成并给出了正确答案?(现在已经有几个月了…!)否,这从未返回有效结果。它只返回在一个月内创建的项目的计数,不包括在请求的月份仍处于活动状态的项目。维度“日期”是否与“发布日期”或“结束日期”相关?@SouravA,是的。Date
是postDate
和endDate
使用的维度。但是,如果您仅在Date
维度上查询多维数据集,它会将其视为postDate
(与大多数冒险作品示例类似)。