Sql 如果今年';s的数据不可用
表:测试Sql 如果今年';s的数据不可用,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,表:测试 Batch Year Value ---------------------- A 2014 11 A 2015 0 A 2016 22 A 2017 0 A 2018 13 B 2015 10 B 2016 0 B 2017 29 B 2018 0 C 2013 24 C 2014 0 D 2015 27 D 2016 0 在此,假设2015年
Batch Year Value
----------------------
A 2014 11
A 2015 0
A 2016 22
A 2017 0
A 2018 13
B 2015 10
B 2016 0
B 2017 29
B 2018 0
C 2013 24
C 2014 0
D 2015 27
D 2016 0
在此,假设2015年没有数据,则应采用2014年的数据,同样,如果某一特定年份某一特定批次的数据不可用,则应将上一年度的数据分配给该年份
我试图通过只获取批处理来放置case语句,但问题是我的查询显示子查询返回多行
SELECT BATCH, YEAR,
(CASE WHEN VALUE = 0 THEN
(SELECT A.VALUE FROM TEST A, TEST B WHERE A.YEAR = B.YEAR-1 AND A.VALUE <> '0') ELSE VALUE END)
FROM TEST;
我使用下面的查询来实现您的结果
CREATE TABLE TEST1(Batch VARCHAR(10), Year INT, Value INT)
INSERT INTO TEST1
VALUES('A', 2014,11),
('A', 2015,0 ),
('A', 2016,22),
('A', 2017,0 ),
('A', 2018,13),
('B', 2015,10),
('B', 2016,0 ),
('B', 2017,29),
('B', 2018,0 ),
('C', 2013,24),
('C', 2014,0 ),
('D', 2015,27),
('D', 2016,0 )
SELECT batch, year, CASE WHEN value = 0 then LAG(value) OVER(PARTITION BY batch ORDER BY year) ELSE value END AS value
FROM TEST1
ORDER BY batch, year
我使用下面的查询来实现您的结果
CREATE TABLE TEST1(Batch VARCHAR(10), Year INT, Value INT)
INSERT INTO TEST1
VALUES('A', 2014,11),
('A', 2015,0 ),
('A', 2016,22),
('A', 2017,0 ),
('A', 2018,13),
('B', 2015,10),
('B', 2016,0 ),
('B', 2017,29),
('B', 2018,0 ),
('C', 2013,24),
('C', 2014,0 ),
('D', 2015,27),
('D', 2016,0 )
SELECT batch, year, CASE WHEN value = 0 then LAG(value) OVER(PARTITION BY batch ORDER BY year) ELSE value END AS value
FROM TEST1
ORDER BY batch, year