我需要以下帮助 - 请帮助。
如何汇总日期范围。??我是Oracle的新手。
答案 0 :(得分:1)
尝试这样的事情:
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);
分享并享受。
答案 1 :(得分:1)
使用硬编码日期有点奇怪,因为您制作范围的方式(并且您的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
以包含更多通用组,但我不确定如何使用它。
答案 2 :(得分:1)
评论部分中您的原始答案中的问题/答案表明您实际上正在寻找两种不同的选择 - 一种用于第一个日期范围,另一种用于重叠的第二个日期范围。只有您希望在单个结果集中获取所有结果记录。您可以使用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;
答案 3 :(得分:1)
在评论中,您说您指定了两组不重叠的日期。这会消除您在问题中发布的数据。有些人浪费时间提出非解决方案,因为你无法以清晰简单的方式满足你的要求。
无论如何,假设你的故事很直接,两组不重叠,那么这对你有用:
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
/