使用 CASE WHEN 子句的百分比差异



我正在使用的表称为"事务"。这些列是 id(客户 ID)、金额(客户花费的金额)、时间戳(购买时间)。

我正在尝试查询:

  • 昨日收入:金额总和。
  • 从 8 天前的收入到昨天的收入的百分比差异。
  • 美特达。
  • 从上个月MTD到本月MTD的百分比差异。

示例数据

id 金额 时间戳
1 50 2021-12-01
2 60 2021-12-02
3 70 2021-11-05
4 80 2022-01-26
5 90 2022-01-25
6 20 2022-01-26
7 80 2022-01-19

需要考虑的一些事项:

  • "昨天与上周"目前在开头使用timestamp::date > current_date - 1。这将仅包括今天的交易,而不是昨天的交易(它说"大于昨天")。我认为应该是timestamp::date = current_date - 1
  • 我在这里可能是错的,但我认为如果当前日期与昨天在同一个月,sum(case when date_trunc('month',timestamp) = date_trunc('month',CURRENT_DATE -1)也会捕获当前日期的交易。你可能不想这样。
  • 我所知,"pct_change_month_prior"应该是1.45,而不是0.5。您在 12 月有110,在 1 月有270270 - 110 = 160160 / 110 = 1.45.现有查询已返回该结果。FWIW,您也可以使用new/old-1以稍微简单的方式获得相同的结果。

好的,所以真的,这是关于你陈述SELECT部分的数学。

更改金额为:new - old

作为乘法量,它是(new - old) / oldnew / old - 1

作为百分比,您需要乘以 100...100 * (new / old - 1)但我知道你并不担心这个。

此外,让我们确保您的新旧正确。

昨天的总和:

sum(case when timestamp::date = CURRENT_DATE - 1 then amount else null end)

8天前 总和:

sum(case when timestamp::date = CURRENT_DATE - 8 then amount else null end)

1个月到昨天的总和:

sum(case when timestamp::date > CURRENT_DATE - 1 - INTERVAL '1 month' AND timestamp::date <= CURRENT_DATE - 1 then amount else null end)

1个月至1个月零1天前的总和:

sum(case when timestamp::date > CURRENT_DATE - 1 - INTERVAL '2 month' AND timestamp::date <= CURRENT_DATE - 1 - INTERVAL '1 month' then amount else null end)

月初到昨天的总和:

sum(case when timestamp::date > DATE_TRUNC('month', CURRENT_DATE - 1) AND timestamp::date <= CURRENT_DATE - 1 then amount else null end)

从昨天的上个月开始到一个月前的昨天总和:

sum(case when timestamp::date > DATE_TRUNC('month', CURRENT_DATE - 1 - INTERVAL '1 month') AND timestamp::date <= CURRENT_DATE - 1 - INTERVAL '1 month' then amount else null end)

重要的是,不要将=更改为>或仅裁剪为日期部分,否则您将包含比您真正想要的更多的内容。

实际上,通过裁剪到月份部分,它几乎总是将两个月的所有交易相加。

相关内容

  • 没有找到相关文章

最新更新