指定日期范围内字段的总和

时间:2013-04-17 10:57:04

标签: oracle plsql sql-date-functions

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

Sample Image

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

4 个答案:

答案 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
/