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);
我有 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);