Sql 如何在oracle中获取最近两年的年度数据

Sql 如何在oracle中获取最近两年的年度数据,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我在项目中使用了一个名为sales_data的表。表结构如下 ID Name Year Sales 1000 ABC 2016 50000 1000 ABC 2017 80000 1000 ABC 2015 90000 1000 ABC 2014 45000 1000 ABC 2013 30000 2000 PQR 2017 80000 2000 PQR 2015 90000 2000 PQR

我在项目中使用了一个名为sales_data的表。表结构如下

ID Name Year Sales 1000 ABC 2016 50000 1000 ABC 2017 80000 1000 ABC 2015 90000 1000 ABC 2014 45000 1000 ABC 2013 30000 2000 PQR 2017 80000 2000 PQR 2015 90000 2000 PQR 2014 75000 2000 PQR 2013 60000 3000 XYZ 2015 123000 3000 XYZ 2013 56000 3000 XYZ 2012 45000 3000 XYZ 2011 30000 从这张桌子上。我想获取最新的连续年度数据。我的结果集需要如下所示

ID Name Year Sales 1000 ABC 2017 80000 1000 ABC 2016 50000 2000 PQR 2017 80000 2000 PQR 2016 0 3000 XYZ 2015 123000 3000 XYZ 2014 0 因为PQR公司的最新数据是2017年,所以是80000,但2016年的数据不在本表中,所以需要为0。 XYZ公司也是如此

请帮我一下。我正在使用Oracle 11g。

您可以试试这个

SELECT  t2.ID,t2.Name,t2.years,COALESCE(t1.Sales,0) Sales
FROM sales_data t1
RIGHT JOIN
(
  SELECT ID,Name,MAX(Year)   years
  FROM sales_data
  GROUP BY ID,Name
  UNION ALL 
  SELECT ID,Name,MAX(Year) - 1  years
  FROM sales_data
  GROUP BY ID,Name
) t2 ON t1.ID = t2.ID AND t1.Name = t2.Name AND  t1.Year = t2.years 
ORDER BY t2.ID,t2.years DESC
sqlfiddle:

演示

还有一个选择:

SQL> with test (id, year, sales) as
  2    (select 1000, 2016, 50000 from dual union
  3     select 1000, 2017, 80000 from dual union
  4     select 1000, 2015, 90000 from dual union
  5     select 1000, 2014, 45000 from dual union
  6     --
  7     select 2000, 2017, 80000 from dual union
  8     select 2000, 2015, 90000 from dual union
  9     select 2000, 2014, 75000 from dual union
 10     --
 11     select 3000, 2015, 123000 from dual union
 12     select 3000, 2013, 56000 from dual union
 13     select 3000, 2012, 45000 from dual
 14    ),
 15  years as
 16    (select id, min_year + column_value - 1 year
 17     from (select id, min(year) min_year, max(year) max_year
 18           from test
 19           group by id
 20          ),
 21          table(cast(multiset(select level from dual
 22                              connect by level <= max_year - min_year + 1
 23                             ) as sys.odcinumberlist))
 24    ),
 25  ranking as
 26    (select y.id, y.year, nvl(t.sales, 0) sales,
 27       row_number() over (partition by y.id order by y.year desc) rn
 28     from years y left join test t on t.id = y.id and t.year = y.year
 29    )
 30  select r.id, r.year, r.sales
 31  from ranking r
 32  where r.rn <= 2
 33  order by r.id, r.year desc;

        ID       YEAR      SALES
---------- ---------- ----------
      1000       2017      80000
      1000       2016      50000
      2000       2017      80000
      2000       2016          0
      3000       2015     123000
      3000       2014          0

6 rows selected.

SQL>
试试这个

SELECT sd1.ID,  sd1.name, sd2.year, COALESCE(sd3.sales,0) 
FROM
(SELECT distinct ID, name from sales_data) as sd1 join 
(SELECT distinct year from sales_data ) as sd2
Left join sales_data sd3
on sd1.ID = sd3.ID AND sd2.year = sd3.year 
SELECT sd1.ID,  sd1.name, sd2.year, COALESCE(sd3.sales,0) 
FROM
(SELECT distinct ID, name from sales_data) as sd1 join 
(SELECT distinct year from sales_data ) as sd2
Left join sales_data sd3
on sd1.ID = sd3.ID AND sd2.year = sd3.year