tableau-api - Tableau 中带条件的窗口总和
问题描述
使用 Tableau 10.5,我正在尝试创建表格/图表,以显示滚动 52 周窗口内的新(“Standing Start”)销售总额。下图显示了从 ISO 周 201733 到 201832 的 52 周窗口内新(常驻)客户的每周销售额总和;这条线显示了销售额的总和。
下图显示了图表最近几周的数据。
“新销售”定义为开始周在报告/ISO 周的 52 周内的客户(在 201832 为报告周的示例中,包括开始周在 201733 和 201832 之间的客户)。采用同一周之间的累计销售额,感兴趣的值是最后一周的累计值(示例中为 5,046,546)。
我需要的是显示每个报告周相应的 52 周总数(因此值将约为每周 500 万),并且条形相对平坦(允许销售增长等)。我的具体问题是,在进行窗口/移动计算时,我无法弄清楚如何定义窗口(即仅限新帐户)。
我希望我的描述足够清楚,以说明我的目标是什么。
提前致谢。
编辑/更新(进一步澄清问题):
下面的示例表显示了在 201824 和 201827 之间从同一时期开立的账户进行的销售额。在 201824 周,只有在 201824 开立的账户有任何销售额(值为 1)。在 201825 周,现在有 2 周的账户:在 201824 周开设的账户和在 201825 周开设的账户,分别产生 2 和 1 的销售额。随后的每一周都有一个额外的一周的账户价值,贡献了 20 的销售额。
+--------+--------+--------+--------+
| 201824 | 201825 | 201826 | 201827 |
+--------+--------+--------+--------+
| | | | 1 |
| | | 1 | 2 |
| | 1 | 2 | 3 |
| 1 | 2 | 3 | 4 |
+--------+--------+--------+--------+
继续该示例,下表显示了类似的数据,但时间段移动了 1 周:
+--------+--------+--------+--------+
| 201825 | 201826 | 201827 | 201828 |
+--------+--------+--------+--------+
| | | | 2 |
| | | 2 | 3 |
| | 2 | 3 | 4 |
| 2 | 3 | 4 | 5 |
+--------+--------+--------+--------+
此表中的销售额总和为 30:第 201825 周开设的账户贡献 14(2 + 3 + 4 + 5),第二周开设的账户贡献 9(2 + 3 + 4),以此类推。
这两个表描述了我正在寻找的方法,我正在寻找的结果将类似于以下内容:
+--------+--------+
| 201827 | 201828 |
+--------+--------+
| 20 | 30 |
+--------+--------+
如果我在 SQL 中做类似的事情,下面给出了我需要的结果:
;with d AS
(
select s.ISOWk, a.OSW as StartWeek, sum(s.Sales) as Sales
from accs a
join sales s
on a.ID = s.ID
where s.ISOWk >= 201701
and a.OSW >= 201701
group by s.ISOWk, a.OSW
)
select c.ISOWk, sum(case when d.ISOWk between FYS and c.ISOWk and StartWeek between FYS and c.ISOWk then Vol else 0 end) as Rolling_ss_vol
from d
cross join (select distinct ISOWk, FYS from tblCalendar c where ISOWk between 201801 and 201835) c
group by c.ISOWk
order by ISOWk
其中 FYS(前一年开始)与 ISO 周相关联,并指示当前销售期的开始时间(即 52 周前)。
解决方案
我在您的示例文件中将 iso 日期转换为常规日期。这使得更容易进行 DATEDIFF 计算。我在 Tableau 的论坛上找到了这个转换公式。
DATEADD('week',INT(MID(STR([Start Week]), 5,2))-1,DATE("01/01/"+(MID(STR([Start Week]), 1,4))))
我对客户 iso 周重复了同样的操作。
然后做了一个 [cust start] LOD 以确保我正确计算 datediff。
{fixed [Cust No] : min([start_week_date])}
然后做了一个 [Sales within 52] 计算字段
if datediff('week',[cust start], [iso_week_date])<52 then [Sales] end
最后,[window_sum_sales] 在里面使用了[Sales within 52]。
window_sum(sum([Sales within 52]),-51,0)
希望这就是您正在寻找的。
工作簿链接https://www.dropbox.com/s/wxw5e2783la4fl4/20180906_stackoverflow_question.twbx?dl=0
推荐阅读
- android - 如何解析json对象内的json数组?
- python - 我想在 for 循环中减去 3D 数组
- javascript - sweetalert.js 行为不正常
- php - 如果从源代码安装但使用 yum 则 PHP 不起作用
- visual-studio - 以编程方式设置 Visual Studio 的“调试源文件”路径
- mongodb - 如何使用多个集合获取未映射的值
- testing - Botium 的 Twitter 连接器
- ios - 如何在 Web 服务响应中隐藏按钮插座?
- mysql - 如何使用 Spring Boot 修复 MySQL 的通信链路故障
- email - Woocommerce 自定义计费字段数据在更新后未显示在电子邮件中