从没有日期列的表中获取会计年度的数据

时间:2016-06-02 12:05:13

标签: sql oracle

我试图创建一个查询(目的:手动数据库测试),它将获得前一个/当前/下一个会计年度的行,然后是SUM(营业额)

鉴于

(1)下表,

(2)财政年度(FY)= 3月至2月

何时上一个FY - 然后 2行:2016/1至2016/2

何时当前风云 - 然后 12行:从2016年3月到2017年2月(年/月)

何时未来风云 - 然后 1行:2017/3

+--------------+---------------+----------+
|  Year (num)  |  Month (num)  | Turnover |
+--------------+---------------+----------+
| 2016         |     1         |   1000   | 
+--------------+---------------+----------+
| 2016         |     2         |   2000   | 
+--------------+---------------+----------+
| 2016         |     3         |   3000   | 
+--------------+---------------+----------+
| 2016         |     4         |   4000   | 
+--------------+---------------+----------+
| 2016         |     5         |   2000   | 
+--------------+---------------+----------+
| 2016         |     6         |   1000   | 
+--------------+---------------+----------+
| 2016         |     7         |   2000   | 
+--------------+---------------+----------+
| 2016         |     8         |   1000   | 
+--------------+---------------+----------+
| 2016         |     9         |   2000   | 
+--------------+---------------+----------+
| 2016         |     10        |   3000   | 
+--------------+---------------+----------+
| 2016         |     11        |   4000   | 
+--------------+---------------+----------+
| 2016         |     12        |   5000   | 
+--------------+---------------+----------+
| 2017         |     1         |   6000   | 
+--------------+---------------+----------+
| 2017         |     2         |   2000   | 
+--------------+---------------+----------+
| 2017         |     3         |   1000   | 
+--------------+---------------+----------+

我提出的最佳解决方案是以下查询,并更改Year值以在多年之间切换。由于使用sysdate创建了一个额外的solumn并检查NOT NULL,因此对我来说感觉很糟糕。有更优雅的方式吗?

WITH CTE AS (

SELECT 
CASE
WHEN Month BETWEEN 3 AND 12 AND Year = 2016                                            
THEN sysdate
WHEN Month BETWEEN 1 AND 2 AND Year = 2017
THEN sysdate
END case_statement_date, 

year, month, turnover, FROM Table

 )

SELECT sum(turnover) FROM CTE  
 WHERE  case_statement_date IS NOT NULL
;

1 个答案:

答案 0 :(得分:3)

这是你想要的吗?

select year + (case when month >= 3 then 0 else -1 end) as fiscal_year,
       sum(turnover)
from t
group by year + (case when month >= 3 then 0 else -1 end) ;