Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如果今年';s的数据不可用_Sql_Oracle_Oracle11g - Fatal编程技术网

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