sql - 相对于固定手动列值条件的列的总和
问题描述
这是我的源数据,其中 TIMESTAMP_WID 指的是 YYYYMMDD
我试图实现的输出结果如下,
逻辑如下,
CUR_TIMESTAMP指,
TO_NUMBER(TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE,'MON'),-2),'YYYYMMDD'))
到目前为止我尝试过的代码如下,
(SELECT
OUTLET,
SUM(SALES_VALUE),
TO_NUMBER(TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE,'MON'),-2),'YYYYMMDD')) AS CUR_TIMESTAMP
FROM SOME_TABLE)
UNION
(SELECT
OUTLET,
SUM(SALES_VALUE),
TO_NUMBER(TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE,'MON'),-3),'YYYYMMDD')) AS CUR_TIMESTAMP
FROM SOME_TABLE)
(SELECT
OUTLET,
SUM(SALES_VALUE),
TO_NUMBER(TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE,'MON'),-4),'YYYYMMDD')) AS CUR_TIMESTAMP
FROM SOME_TABLE)
在上面的 sql 查询中,我可以填充与我的目标相同的内容,但是,在计算SUM(SALES_VALUE)时有一个非常重要的逻辑
什么时候,
CUR_TIMESTAMP=20200101
Then,
SUM(SALES_VALUE) will be calculated for
TIMESTAMP_WID IN (20200101,20191201,20191101,20191001,20190901,20191001,20190901,20190801)
什么时候,
CUR_TIMESTAMP=20201201
Then,
SUM(SALES_VALUE) will be calculated for
TIMESTAMP_WID IN (20191201,20191101,20191001,20190901,20191001,20190901,20190801,20190701)
什么时候,
CUR_TIMESTAMP=20201101
Then,
SUM(SALES_VALUE) will be calculated for
TIMESTAMP_WID IN (20191101,20191001,20190901,20191001,20190901,20190801,20190701,20190601)
任何人请指导我
解决方案
这听起来像是一个累积和:
select t.*
from (select t.*,
sum(sales_value) over (partition by outlet order by timestamp_wid) as running_sales_value
from some_table st
) t
然后,您可以添加一个where
子句来过滤您想要的行。我认为:
select t.*
from (select t.*,
sum(sales_value) over (partition by outlet order by timestamp_wid) as running_sales_value
from some_table st
) t
where timestamp_wid >= TO_NUMBER(TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE, 'MON'), -4), 'YYYYMMDD')) and
timestamp_wid < TO_NUMBER(TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE, 'MON'), -2), 'YYYYMMDD')) and
推荐阅读
- java - java DatagramSocket中如何发送对象不实现Serializable接口
- c++ - 旋转二维数组的最快方法
- r - 更改 r 中数字命名列的顺序
- java - 如何打印 LinkedHashMap
- java - 稳定的项目还应该使用 spring-boot-starter-* 吗?
- javascript - 使用 map 渲染两次会导致 React Native 出错
- flutter - onTap 不指向新页面
- laravel - Laravel 使用 Carbon 解析日期格式
- python - Python imagemagick返回非零
- paypal - 我想验证给定的电子邮件地址是否存在于贝宝中?我需要验证他们提供给我的贝宝电子邮件是否存在?