Year-To-Date 往年(去年同期)

Year-To-Date for Previous Years (Same Period Last Year)

我有 3 年的交易数据,我想在 Year-To-Date 的基础上报告不同年份的绩效。

数据是这样的:

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), 但过去两年的同一时期(01/01/2017 - 29-03-2017 之间) 和(01/01/2016 和 29/03/2016)collection 分别为 2,300 和 2,500。

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

谢谢。

只过滤那些日期在一年中较早的月份或日期在一年中同一月的 earlier-or-same 月中的日期的值:

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" );

(注意:第一个查询将包含当前 day-of-the-year 的所有结果 - 即 00:00 - 23:39 - 而第二个查询仅包含来自 day-of-the-year 的结果00:00 和当前时间之间的当前 day-of-the-year。您可以对第二个查询提供类似的行为 - 一种方法是使用 TRUNC( "DATE" )。)

您只想考虑某些日子,即一月一日到当天。所以为此写一个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);