根据另一个维度的值测量一个维度
Measure over one dimension conditional on value of another dimension
我是 MDX 的新手,遇到了一个一直困扰我的问题。
我基本上有以下 table(在我的多维数据集 中幕后显然有更多维度)。如果 ID 是昨天新的,它将出现在 多维数据集 中,日期为 T-1,类别为“New”,对于日期 T 和类别“Old”,它也会有一组不同的值。如果昨天是旧的,那么今天将是旧的并且具有不同的值。
我可以获取 T-1 切片上“New”ID 的值总和,但无法获取昨天为“新”(因此今天为旧)的 ID 在今天 (T) 切片上的值 - 即昨天新 ID 的今天值。
| ID | Category | Date | Value |
|---------|------------|------|-------|
| 1 | New | T-1 | a |
| 1 | Old | T | b |
| 2 | Old | T-1 | c |
| 2 | Old | T | d |
| 3 | New | T-1 | e |
| 3 | Old | T | f |
如果数据是平坦的 table 我想我可以 SQL 查询它,但是当涉及到 MDX 时我有点难过。谢谢
编辑:
下面的 MDX 给出了 "Old" ID 的总和。我想我需要以某种方式创建一个新度量,它沿着日期切片查看 ID 的 PrevMember 并检查它是否是新的,如果是,则分配该新度量的 ID 的当前度量 - 但我不知道如何去做...
SELECT
NON EMPTY (
[Date].Members
) ON 0
,
NON EMPTY (
[Measures].[Value.SUM]
) ON 1
FROM [MyCube]
WHERE (
[Category].&[Old]
)
编辑 2:
使用 SouravA 的回答,我的代码使用以下代码工作。
WITH
SET NewIDs AS
INTERSECT(NonEmpty([ID].Children, CROSSJOIN([Date].&[T-1], [Category].&[Old]))
, NonEmpty([ID].Children, CROSSJOIN([Date].&[T], [Category].&[EOD]))
)
SELECT
NON EMPTY([Dim2].Children
) ON 0
,
NON EMPTY([NewIDs]
) ON 1
FROM [MyCube]
WHERE [Measures].[Value]
这有帮助吗? (在下面的代码中添加了注释)
WITH SET NewYesterdayOldToday ///Get all such Ids which were new yesterday but are old today
AS
INTERSECT(
NonEmpty(
[YourTable].[Id].[All].MEMBERS,
[YourTable].[Category].&[Old] * [YourTable].[Date]. &[T])
,
NonEmpty(
[YourTable].[Id].[All].MEMBERS,
[YourTable].[Category].&[New] * [YourTable].[Date]. &[T-1])
)
MEMBER TotalValue AS ///Getting the sum of values corresponding to those Ids which are "NewYesterdayOldToday" today
(
NewYesterdayOldToday, [YourTable].[Date]. &[T], [Measures].[Value.SUM]
)
SELECT TotalValue
ON 0
FROM [MyCube]
我是 MDX 的新手,遇到了一个一直困扰我的问题。
我基本上有以下 table(在我的多维数据集 中幕后显然有更多维度)。如果 ID 是昨天新的,它将出现在 多维数据集 中,日期为 T-1,类别为“New”,对于日期 T 和类别“Old”,它也会有一组不同的值。如果昨天是旧的,那么今天将是旧的并且具有不同的值。
我可以获取 T-1 切片上“New”ID 的值总和,但无法获取昨天为“新”(因此今天为旧)的 ID 在今天 (T) 切片上的值 - 即昨天新 ID 的今天值。
| ID | Category | Date | Value |
|---------|------------|------|-------|
| 1 | New | T-1 | a |
| 1 | Old | T | b |
| 2 | Old | T-1 | c |
| 2 | Old | T | d |
| 3 | New | T-1 | e |
| 3 | Old | T | f |
如果数据是平坦的 table 我想我可以 SQL 查询它,但是当涉及到 MDX 时我有点难过。谢谢
编辑:
下面的 MDX 给出了 "Old" ID 的总和。我想我需要以某种方式创建一个新度量,它沿着日期切片查看 ID 的 PrevMember 并检查它是否是新的,如果是,则分配该新度量的 ID 的当前度量 - 但我不知道如何去做...
SELECT
NON EMPTY (
[Date].Members
) ON 0
,
NON EMPTY (
[Measures].[Value.SUM]
) ON 1
FROM [MyCube]
WHERE (
[Category].&[Old]
)
编辑 2:
使用 SouravA 的回答,我的代码使用以下代码工作。
WITH
SET NewIDs AS
INTERSECT(NonEmpty([ID].Children, CROSSJOIN([Date].&[T-1], [Category].&[Old]))
, NonEmpty([ID].Children, CROSSJOIN([Date].&[T], [Category].&[EOD]))
)
SELECT
NON EMPTY([Dim2].Children
) ON 0
,
NON EMPTY([NewIDs]
) ON 1
FROM [MyCube]
WHERE [Measures].[Value]
这有帮助吗? (在下面的代码中添加了注释)
WITH SET NewYesterdayOldToday ///Get all such Ids which were new yesterday but are old today
AS
INTERSECT(
NonEmpty(
[YourTable].[Id].[All].MEMBERS,
[YourTable].[Category].&[Old] * [YourTable].[Date]. &[T])
,
NonEmpty(
[YourTable].[Id].[All].MEMBERS,
[YourTable].[Category].&[New] * [YourTable].[Date]. &[T-1])
)
MEMBER TotalValue AS ///Getting the sum of values corresponding to those Ids which are "NewYesterdayOldToday" today
(
NewYesterdayOldToday, [YourTable].[Date]. &[T], [Measures].[Value.SUM]
)
SELECT TotalValue
ON 0
FROM [MyCube]