我需要以下帮助 - 请帮助。
如何总结日期范围。??我是 Oracle 的新手。
在评论中,您说您指定了两组不重叠的日期。这与您在问题中发布的数据相矛盾。由于您无法以清晰简单的方式解释您的需求,因此有几个人浪费了时间提出非解决方案。
无论如何,假设你终于明白了你的故事并且两组不重叠,这应该适合你:
with data as (
select field1
, field2
, field4
, case when field3 between date '2011-10-30' and date '2012-01-28' then 'GR1'
when field3 between date '2012-10-28' and date '2013-02-03' then 'GR2'
else null
end as GRP
from your_table )
select field1
, field2
, GRP
, sum(field4) as sum_field4
from data
where GRP is not null
order by 1, 2, 3
/
原始答案的评论部分中的问题/答案表明您实际上正在寻找两个不同的选择 - 一个用于第一个日期范围,一个用于重叠的第二个日期范围。只有您想在单个结果集中获取所有结果记录。您可以为此使用 UNION:
select field1, field2, min(trunc(field3))) || '-' || max(trunc(field3))), sum(field4)
from yourtable
where to_char(field3, 'yyyymmdd') between '20130201' and '20130204'
group by field1, field2
UNION
select field1, field2, min(trunc(field3))) || '-' || max(trunc(field3))), sum(field4)
from yourtable
where to_char(field3, 'yyyymmdd') between '20130203' and '20130207'
group by field1, field2
order by 1, 2, 3;
使用硬编码日期有点奇怪,就像您制作范围的方式一样(并且您的field4
值在示例输出中似乎是错误的),但假设您知道自己想要什么......
您可以使用case
语句根据日期为行分配一个虚拟组号,然后使用一个外部查询来group by
针对该虚拟字段,我称之为gr
:
select field1, field2,
to_char(min(field3), 'MM/DD/YYYY')
||'-'|| to_char(max(field3), 'MM/DD/YYYY') as field3,
sum(field4) as field4
from (
select field1, field2, field3, field4,
case when field3 between date '2013-02-01'
and date '2013-02-05' - interval '1' second then 1
when field3 between date '2013-02-05'
and date '2013-02-08' - interval '1' second then 2
end as gr
from t42
)
group by field1, field2, gr
order by field1, field2, gr;
F FIELD2 FIELD3 FIELD4
- ---------- --------------------- ----------
A 1 02/01/2013-02/04/2013 14
A 1 02/05/2013-02/07/2013 21
如果某个边界日没有数据,则显示field3
将看起来错误,但我不确定这是这种方法的最大问题 *8-)
您可以修改case
以拥有更多通用组,但我不确定如何使用它。
尝试这样的事情:
SELECT FIELD1, FIELD2, TRUNC(MIN(FIELD3)), TRUNC(MAX(FIELD3)), SUM(FIELD4)
FROM SOME_TABLE
WHERE FIELD3 BETWEEN DATE '2013-02-01'
AND DATE '2013-02-04' + INTERVAL '1' DAY - INTERVAL '1' SECOND
GROUP BY FIELD1, FIELD2
ORDER BY MIN(FIELD3);
分享和享受。