显示收入累计增加的列,然后仅在特定日期后重复最大值
Column showing revenue increasing cumulatively, then only repeats the max value after a certain date
我正在创建一个仪表板,除其他外,它可以显示销售代表在加入公司的第一个月内产生了多少收入。
这将基于我用 SQL 创建的 table。这个 table 的最简单版本是:
日期(将是一周中的每一天)、销售代表姓名、他们加入时产生的收入。
这将累积增加(因此当您 select 在仪表板中的日期时,您会看到截至该日生成的总量)。
因为我们只对第一个月产生的收入感兴趣,所以我希望我的收入 table 能够累积增加,直到我们从开始日期到 1 个月,然后,无论最大数量是多少, 在我的专栏中一直重复。所以在第一个月之后,您在仪表板中 select 的任何日期,您仍然只会看到 1 个月的数字。我想这样做,因为我认为在 SQL 而不是我的仪表板工具中会更容易,因为那时我必须通过更多数据和 运行 进一步计算。
为此,我首先创建了一个子查询:
(SELECT date, rep name, sum(revenue) as revenue
FROM rev Group BY 1,2) as a
所以这让我每天都为代表创造收入。
然后我查询这个子查询,同时加入 table 给我开始日期。所以我的新查询是这样开始的:
SELECT a.date, a.rep name,
SUM(CASE WHEN (a.date- b.join_date < 1 month) then sum(a.revenue)
我现在卡在了 ELSE 部分。我要在这里分区吗?
我的想法是这样的:
ELSE sum(revenue) partition over(rep name, add_months(join_date, 1) order by date asc)
但我认为这没有多大意义?
基本上,我想看到的最终输出是这样的。为了保持 table 简短,我假设我希望在他们加入的第一周内获得收入(而不是我实际想要的月份):
在这个例子中,我假装销售代表在他们加入的第一天开始赚钱,也就是 2020-02-19。我在前三列中拥有的是我的子查询的当前输出(他们每天生成的个人金额)。我想将其聚合到另一个查询,这给了我第 4 列。我希望这能让事情更清楚一点!
正如 Fred 评论的那样,运行 总数中的条件聚合应该是您想要的:
SELECT date, rep_name, sum(revenue) as revenue
,sum(CASE WHEN a.date <= add_months(b.join_date, 1) then sum(revenue) END)
over (partition by rep_name
order by date
rows unbounded preceding) as monthly_rev
FROM rev as a
join ...
Group BY 1,2
我正在创建一个仪表板,除其他外,它可以显示销售代表在加入公司的第一个月内产生了多少收入。
这将基于我用 SQL 创建的 table。这个 table 的最简单版本是:
日期(将是一周中的每一天)、销售代表姓名、他们加入时产生的收入。
这将累积增加(因此当您 select 在仪表板中的日期时,您会看到截至该日生成的总量)。
因为我们只对第一个月产生的收入感兴趣,所以我希望我的收入 table 能够累积增加,直到我们从开始日期到 1 个月,然后,无论最大数量是多少, 在我的专栏中一直重复。所以在第一个月之后,您在仪表板中 select 的任何日期,您仍然只会看到 1 个月的数字。我想这样做,因为我认为在 SQL 而不是我的仪表板工具中会更容易,因为那时我必须通过更多数据和 运行 进一步计算。
为此,我首先创建了一个子查询:
(SELECT date, rep name, sum(revenue) as revenue
FROM rev Group BY 1,2) as a
所以这让我每天都为代表创造收入。
然后我查询这个子查询,同时加入 table 给我开始日期。所以我的新查询是这样开始的:
SELECT a.date, a.rep name,
SUM(CASE WHEN (a.date- b.join_date < 1 month) then sum(a.revenue)
我现在卡在了 ELSE 部分。我要在这里分区吗?
我的想法是这样的:
ELSE sum(revenue) partition over(rep name, add_months(join_date, 1) order by date asc)
但我认为这没有多大意义?
基本上,我想看到的最终输出是这样的。为了保持 table 简短,我假设我希望在他们加入的第一周内获得收入(而不是我实际想要的月份):
在这个例子中,我假装销售代表在他们加入的第一天开始赚钱,也就是 2020-02-19。我在前三列中拥有的是我的子查询的当前输出(他们每天生成的个人金额)。我想将其聚合到另一个查询,这给了我第 4 列。我希望这能让事情更清楚一点!
正如 Fred 评论的那样,运行 总数中的条件聚合应该是您想要的:
SELECT date, rep_name, sum(revenue) as revenue
,sum(CASE WHEN a.date <= add_months(b.join_date, 1) then sum(revenue) END)
over (partition by rep_name
order by date
rows unbounded preceding) as monthly_rev
FROM rev as a
join ...
Group BY 1,2