数据组和总和在一年的feb

时间:2016-02-23 11:43:48

标签: oracle group-by

我的数据就像

200201  0
200202  2
200203  0
200204  4
200205  0
200206  0
200207  0
200208  0
200209  0
200210  0
200211  0
200212  5
200301  0
200302  0
200303  0
200304  0
200305  2
200306  0
200307  0
200308  0
200309  0
200310  0
200311  3
200312  0
200401  0
200402  0

我想要输出

2002FEB 2
MAR2002TOFEB2003    9
MAR2003TOFEB2004    5

2 个答案:

答案 0 :(得分:0)

你需要像这样的分组查询:

select 'MAR '||(year-1)||' to FEB '||year period, sum(val) sum_val
  from (select distinct substr(mth, 1, 4) year from data) y 
  join data d on y.year-1 ||'02' < d.mth and d.mth <= y.year || '02'
  group by year order by year

输出:

PERIOD                SUM_VAL
--------------------  ----------
MAR 2001 to FEB 2002           2
MAR 2002 to FEB 2003           9
MAR 2003 to FEB 2004           5

测试数据:

create table data (mth varchar2(6), val number(3));
insert into data values (200201, 0);
insert into data values (200202, 2); 
insert into data values (200203, 0); 
insert into data values (200204, 4); 
insert into data values (200205, 0); 
insert into data values (200206, 0); 
insert into data values (200207, 0); 
insert into data values (200208, 0); 
insert into data values (200209, 0); 
insert into data values (200210, 0); 
insert into data values (200211, 0); 
insert into data values (200212, 5); 
insert into data values (200301, 0); 
insert into data values (200302, 0); 
insert into data values (200303, 0); 
insert into data values (200304, 0); 
insert into data values (200305, 2); 
insert into data values (200306, 0); 
insert into data values (200307, 0); 
insert into data values (200308, 0); 
insert into data values (200309, 0); 
insert into data values (200310, 0); 
insert into data values (200311, 3); 
insert into data values (200312, 0);
insert into data values (200401, 0); 
insert into data values (200402, 0);

答案 1 :(得分:0)

Oracle设置

CREATE TABLE data (
  year_month CHAR(6),
  val        INT
);

(插入数据)

<强>查询

SELECT 'MAR' || Year || 'TOFEB' || ( Year + 1 ) AS range,
       SUM( val ) AS total
FROM   (
  SELECT EXTRACT( YEAR FROM ADD_MONTHS( TO_DATE( year_month, 'YYYYMM' ), -2 ) ) AS year,
         val
  FROM   data
)
GROUP BY year
ORDER BY year;

<强>输出

RANGE            TOTAL
---------------- -----
MAR2001TOFEB2002     2 
MAR2002TOFEB2003     9 
MAR2003TOFEB2004     5