-2

我需要以下帮助 - 请帮助。

示例图像

如何总结日期范围。??我是 Oracle 的新手。

4

4 回答 4

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
/
于 2013-04-17T13:57:38.480 回答
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;
于 2013-04-17T12:03:27.317 回答
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以拥有更多通用组,但我不确定如何使用它。

于 2013-04-17T11:47:49.890 回答
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);

分享和享受。

于 2013-04-17T11:16:13.173 回答