问题描述
我在 Sales 表中有一个日期列。我在选择窗格(过滤器)中使用该日期列。
示例场景:
现在我选择了选择窗格日期“15-10-2020”,条形图仅显示“15-10-2020”的销售额。但我需要查找主日历并显示从 start_month 日期到直到选定日期的维度
预期输出:条形图需要显示来自 '28-09-2020' 至 '15-10-2020'
解决方法
方法是生成从 Start_Month
到 TransDate
(组成字段名称)的日期
假设这是我们拥有的数据:
Transactions:
Load * inline [
TransDate,Value
15-10-2020,100
27-07-2021,50
];
MasterCalendar_Temp:
Load * inline [
Start_Month,End_Month,Month_number
28-09-2020,01-11-2020,1
02-11-2020,29-11-2020,2
30-11-2020,27-12-2020,3
28-12-2020,31-01-2021,4
01-02-2021,28-02-2021,5
01-03-2021,28-03-2021,6
29-03-2021,02-05-2021,7
03-05-2021,30-05-2021,8
31-05-2021,27-06-2021,9
28-06-2021,01-08-2021,10
02-08-2021,29-08-2021,11
30-08-2021,26-09-2021,12
];
第一步是找出每个 TransDate
属于哪个区间。为此,我们将使用 IntervalMatch 函数
Inner Join
IntervalMatch ( TransDate )
Load
Start_Month,End_Month
Resident
MasterCalendar_Temp
;
此时 MasterCalendar_Temp
表将如下所示:
所以我们现在知道每个 TransDate
下一步是将 MasterCalendar_Temp
数据加载到单独的表中,但将 Start_Month
和 TransDate
连接成一个:
NoConcatenate
MasterCalendar:
Load
Start_Month,Start_Month & '_' & TransDate as Start_TransDate_Temp
Resident MasterCalendar_Temp;
// we dont need this table anymore
Drop Table MasterCalendar_Temp;
一旦我们有了它,我们就可以开始创建我们的日期
// loop through each value in Start_TransDate_Temp field
// for each step extract Start_Month and TransDate values
// use these two values to generate the dates between them
for i = 1 to FieldValueCount('Start_TransDate_Temp')
let value = FieldValue('Start_TransDate_Temp',$(i));
let startDate = num(SubField('$(value)','_',1));
let transDate = num(SubField('$(value)',2));
Dates:
LOAD
date('$(transDate)','DD-MM-YYYY') as TransDate,date($(startDate) + IterNo() - 1,'DD-MM-YYYY') AS DisplayDates
AUTOGENERATE (1)
WHILE
$(startDate) + IterNo() -1 <= $(transDate)
;
next
// we dont need this table anymore
Drop Table MasterCalendar;
就是这样!
脚本重新加载后,我们将有两个表:
Transactions
表未受影响,Dates
表将具有如下值:
如您所见,对于每个 TransDate
,我们都有日期范围(从相应的 Start_Month
到 TransDate
如果我们构建一个简单的条形图(以 DisplayDates
作为维度,sum(Value)
作为度量)并且不应用任何选择:
如果选择一个 TransDate
: