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
(与大多数冒险作品示例类似)。