考虑下面的原始数据
opptyID | 账户ID | 产品 | 关闭 | 开始 | 结束 | 数量 |
---|---|---|---|---|---|---|
12 | 1 | A | 23 年 1 月 1 日 | 23 年 1 月 1 日 | 23 年 2 月 1 日 | 10.00 |
13 | 1 | A | 23 年 2 月 1 日 | 23 年 2 月 1 日 | 23 年 9 月 10 日 | 2.00 |
17 | 2 | A | 23 年 2 月 1 日 | 23 年 2 月 1 日 | 23 年 9 月 10 日 | 100.00 |
14 | 1 | A | 23 年 1 月 1 日 | 23 年 2 月 1 日 | 23 年 5 月 1 日 | 4.00 |
15 | 1 | A | 12 月 22 日 | 12 月 22 日 | 23 年 3 月 1 日 | 40.00 |
16 | 1 | A | 23 年 3 月 1 日 | 23 年 3 月 1 日 | 23 年 8 月 1 日 | 39.00 |
我想知道续订数量是多少。
探索了几种方法后,我正在考虑实现这个逻辑
为了实现上述内容,我尝试了以下两种方法
方式1:将到期和开始表分配给变量,每个表包含帐户和数量(按帐户汇总)
问题 – 我在引用变量中的 ID 时无法使用 intersect 函数。 (我只需要使用 ID 列,否则相交也会匹配数量列)
方法 2:仅使用帐户 ID 创建到期和启动表,因此相交很容易编码。
问题 – 如何从起始表中返回常见 ID 的数量?
这是代码
Renewal via Tables =
//to find the IDs with lic expiring in period
VAR lic_expire =
CALCULATETABLE (
FILTER (
ALL ( Sheet1 ),
Sheet1[Start] <= MAX ( fiscaldate[Date] )
&& Sheet1[End] >= MIN ( fiscaldate[Date] )
&& Sheet1[End] <= MAX ( fiscaldate[Date] )
),
Sheet1[Account ID]
)
//to find the IDs with lic starting in period
VAR lic_start =
CALCULATETABLE (
FILTER (
ALL ( Sheet1 ),
Sheet1[End] > MAX ( fiscaldate[Date] )
&& Sheet1[Start] >= MIN ( fiscaldate[Date] )
&& Sheet1[Start] <= MAX ( fiscaldate[Date] )
),
Sheet1[Account ID]
)
VAR commonIDs = INTERSECT(lic_expire, lic_start)
RETURN
CALCULATE(
SUMX (
SUMMARIZE (
CALCULATETABLE (
FILTER (
ALL ( Sheet1 ),
Sheet1[End] > MAX ( fiscaldate[Date] )
&& Sheet1[Start] >= MIN ( fiscaldate[Date] )
&& Sheet1[Start] <= MAX ( fiscaldate[Date] )
&& Sheet1[Account ID] IN {INTERSECT(lic_expire,lic_start)} *//This fails. I need to filter only common IDs to get the total start qty*
),
Sheet1[Account ID]
),
"start qty", SUM ( Sheet1[Qty] )
),
[start qty]
)
)
尝试以下操作:
Qty Renewal =
var minD = MIN(fiscaldate[Date])
var maxD = MAX(fiscaldate[Date])
var curIds = DISTINCT(Sheet1[Account ID])
var accountIdsExpire =
CALCULATETABLE(
DISTINCT(Sheet1[Account ID]),
ALL(Sheet1),
Sheet1[Start] <= maxD
&& Sheet1[End] >= minD
&& Sheet1[End] <= maxD
)
RETURN
CALCULATE(
SUM(Sheet1[Qty]),
ALL(Sheet1),
Sheet1[Account ID] IN INTERSECT(curIds, accountIdsExpire),
Sheet1[End] > maxD
&& Sheet1[Start] >= minD
&& Sheet1[Start] <= maxD
)