【发布时间】:2019-03-08 22:14:14
【问题描述】:
我有一个如下所示的数据透视表:
问题:捐助者不会像捐赠那样加起来总和。这是因为捐赠者的年龄范围是根据每份礼物的日期确定的,并且在一年的过程中,捐赠者可以跨越范围。
请求:我想要一个 DAX 公式来将捐赠者限制在一个范围内。在一个理想的世界里,这将基于他们一年中大部分时间属于哪个年龄段,但我会满足于任意保留其中一个。我相信在 SQL 中,您可以通过分区和排名来解决这个问题。
基础表样本:
| Donation_ID | Donor_ID | Donation_Date | Amount | age at time of gift | summary_range |
|-------------|----------|---------------|--------|---------------------|---------------|
| 1 | 100 | 3/15/2017 | 400 | 39 | <40 |
| 2 | 101 | 4/3/2017 | 50 | 69 | 60-69 |
| 3 | 100 | 5/30/2017 | 15 | 40 | 40-49 |
| 4 | 101 | 10/7/2017 | 20 | 69 | 60-69 |
| 5 | 100 | 1/23/2018 | 220 | 40 | 40-49 |
| 6 | 101 | 2/17/2018 | 25 | 70 | 70+ |
更新 - 我得到以下代码在 DaxStudio 中工作。但后来它在 Excel 中失败了,说“summarizecolumns 不能有外部过滤器上下文”。根据下一页底部的脚注,这显然只是 Excel 的一个限制:https://www.sqlbi.com/articles/introducing-summarizecolumns/
EVALUATE(
// filter context of the pivot table EXCEPT no filter on age range
var fc = CALCULATETABLE(
data_table,
data_table[Donation_Date] >= date(2017,3,1),
data_table[Donation_Date] <= date(2018,2,28)
)
var hh = SUMMARIZECOLUMNS(data_table[Donor_ID], data_table[summary_range],data_table[age at time of gift], fc)
var ranked =
ADDCOLUMNS(
hh,
"RankByAge",
RANKX (
FILTER(
SUMMARIZECOLUMNS(
data_table[Donor_ID],data_table[age at time of gift],
hh
),
data_table[Donor_ID] = EARLIER(data_table[Donor_ID])
),
data_table[age at time of gift],
,
desc,
DENSE
)
)
return
// ultimately need to count the rows rather than just return them
// the second criteria would come from the filter context in Excel
FILTER(ranked, [RankByAge] = 1 && [summary_range] = "<40" )
)
【问题讨论】:
-
如果您提供更具描述性的标题并包含数据表外观示例,您更有可能获得帮助。 mcve 是理想的选择。
-
谢谢@AlexisOlson。我对否决票感到沮丧,但这也许可以解释这一点。我已编辑问题以提供不同的标题和示例数据。
-
在新社区中制定规范总是很困难。您的修改使这个问题变得更好!
标签: dax powerpivot