Tableau中具有条件的窗口总和

时间:2018-09-06 10:39:31

标签: tableau running-total

使用Tableau 10.5我正在尝试创建表/图表,以显示在52周滚动窗口中新的销售(“开始销售”)的总数。下图显示了在ISO周201733至201832之间的52周内,新客户(新成立的客户)每周的销售总额;该行显示了销售总额。

Running Total of New Sales

下图显示了图表数据的最后几周。

Underlying chart data

“新销售”定义为在报告/ ISO周的52周之内有开始周的客户(在示例中,报告周为201832,包括在201733和201832之间为周的客户)。取同一周之间的Sales的运行总值,利息值是最后一周的运行总值(示例中为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周)。

1 个答案:

答案 0 :(得分:0)

我将示例文件中的iso日期转换为常规日期。这样可以更轻松地进行DATEDIFF计算。我在Tableau的论坛上找到了用于此转换的公式。

DATEADD('week',INT(MID(STR([Start Week]), 5,2))-1,DATE("01/01/"+(MID(STR([Start Week]), 1,4))))

我在客户同周重复了同样的操作。

然后进行了[cust start] LOD,以确保我正确计算datediff。

{fixed [Cust No] : min([start_week_date])}

然后在[52内销售]计算字段中

if datediff('week',[cust start], [iso_week_date])<52 then [Sales] end

最后,[window_sum_sales]使用其中的[52个销售范围]。

window_sum(sum([Sales within 52]),-51,0)

希望这是您想要的。

工作簿链接https://www.dropbox.com/s/wxw5e2783la4fl4/20180906_stackoverflow_question.twbx?dl=0