sql - 按日期间隔分组 Oracle
问题描述
我想从一个表中检索整个月的重量数据总和。我需要帮助的是,我想将结果分组为每月 1-15 和每月第二行 16-31 的 2 部分总和。
SELECT(SUM(B.SCALE_WEIGHT) FROM TRACKING.DATALOG_TAB B WHERE B.MATERIALID= 1 AND B.SCALE_EVENTDATE BETWEEN TO_DATE(TRUNC(TO_DATE('2020-10-1', 'YYYY-MM-DD'),'MONTH')) AND TO_DATE(TRUNC(TO_DATE('2020-10-1', 'YYYY-MM-DD'), 'MONTH')+30)
GROUP BY(somthing like this - 1-15 and 16-31)
解决方案
这是一种选择:
select
1 + floor(extract(day from scale_eventdate) / 16) as fortnight,
sum(b.scale_weight) as sum_scale_weight
from tracking.datalog_tab b
where
materialid = 1
and scale_eventdate >= date '2020-10-01'
and scale_eventdate < date '2020-11-01'
group by 1 + floor(extract(day from scale_eventdate) / 16)
这从日期中提取天数,然后使用算法:从该月的 1 日到 15 日的每一天都进入fortnight
number 1
,之后的所有内容都进入 bucket 2
。
我们也可以用to_char()
一个case
表达式来做到这一点,它更具表现力:
select
case when to_char(scale_eventdate, 'dd') <= '15' then 1 else 2 end as fortnight,
sum(b.scale_weight) as sum_scale_weight
from tracking.datalog_tab b
where
materialid = 1
and scale_eventdate >= date '2020-10-01'
and scale_eventdate < date '2020-11-01'
group by case when to_char(scale_eventdate, 'dd') <= '15' then 1 else 2 end
请注意,我将日期过滤逻辑更改为使用标准日期文字,这使查询更短且更具可读性。
推荐阅读
- docker - 创建机器时出错:机器创建期间驱动程序出错:无法启动 VM:Windows-10 上的 Docker 安装
- android - Android - 指定每个片段的主题
- swift - swift中的奇怪字典
- php - App Engine - PHP Symfony - 如何要求使用 app.yaml 登录
- c# - MongoDB C#驱动程序如何更新更新文档的集合
- c# - ShaderGraph 材质颜色变化
- node.js - EJS/Node/Express - 有一个部分标题,如何更改每个页面的标题?
- angular - 如何正确使用 mat-autocomplete 和远程 graphQL 数据?
- unity3d - 着色器图,纹理不循环
- r - R中的子集字符串