往年的年初至今(去年同期)

时间:2018-03-29 07:33:57

标签: sql oracle date-range

我有3年的交易数据,我想报告年初至今的不同年度的表现。

数据如下:

REP_NAME : SECTION : AMOUNT : DATE
Mark     : Sec1    : 2,000  : 01/10/2016
Jane     : Sec2    : 1,400  : 02/12/2017

等等......

我想要做的是编写一个查询,该查询将对每年的所有金额进行分组,但由当前年份的当前日期控制。

2016 : 2017 : 2018
2500 : 2300 : 3400

显示,2018年的年初至今是3400(即01/01/2018 - 29/03/2018之间), 但过去两年同期(2017年1月1日至2017年3月29日) (2016年1月1日和2016年3月29日)该系列分别为2,300和2,500。

我希望这很清楚。我正在使用Oracle数据库。

感谢。

2 个答案:

答案 0 :(得分:0)

只需过滤那些日期在一年中较早的月份或日期在该月的某一天或同一天的同一个月中的值:

SELECT EXTRACT( YEAR FROM "DATE" ) AS year,
       SUM( AMOUNT ) AS total_year_to_date_amount
FROM   your_table
WHERE  (  EXTRACT( MONTH FROM "DATE" ) < EXTRACT( MONTH FROM SYSDATE )
       OR (   EXTRACT( MONTH FROM "DATE" ) =  EXTRACT( MONTH FROM SYSDATE )
          AND EXTRACT( DAY   FROM "DATE" ) <= EXTRACT( DAY   FROM SYSDATE )
          )
       )
AND    "DATE" >= ADD_MONTHS( TRUNC( SYSDATE, 'YEAR' ), -24 )
GROUP BY EXTRACT( YEAR FROM "DATE" );

或者您可以明确设置范围:

SELECT EXTRACT( YEAR FROM "DATE" ) AS year,
       SUM( AMOUNT ) AS total_year_to_date_amount
FROM   your_table
WHERE  "DATE" BETWEEN TRUNC( SYSDATE, 'YEAR' )
                  AND SYSDATE
OR     "DATE" BETWEEN ADD_MONTHS( TRUNC( SYSDATE, 'YEAR' ), -12 )
                  AND ADD_MONTHS( SYSDATE, -12 )
OR     "DATE" BETWEEN ADD_MONTHS( TRUNC( SYSDATE, 'YEAR' ), -24 )
                  AND ADD_MONTHS( SYSDATE, -24 )
GROUP BY EXTRACT( YEAR FROM "DATE" );

(注意:第一个查询将包含当前日期的所有结果 - 即00:00 - 23:39 - 而第二个查询仅包括当前日期的结果在00:00和当前时间之间的年份。您可以给第二个查询提供类似的行为 - 一种方法是使用TRUNC( "DATE" )。)

答案 1 :(得分:0)

您只想考虑某些日子,即1月1日至当天。所以为此编写一个WHERE子句,查看月份和日期,忽略年份。

where to_char(date, 'mmdd') <= to_char(sysdate, 'mmdd')

然后你想要每年的总和。所以按年分组。

select
  extract(year from date) as year,
  sum(amount) as total
from mytable
where to_char(date, 'mmdd') <= to_char(sysdate, 'mmdd')
group by extract(year from date)
order by extract(year from date);