#sql #sql_server
Делаю такой запрос на t-sql:
SELECT *,
CASE WHEN Sum_ IS NOT NULL THEN Sum_
ELSE COALESCE(Sum_, 0)
END AS first_Non_Null
FROM dbo.VIEW_1;
GO
Где идет обработка поля Sum_, если оно пустое, то заменяем его на 0, в противном
случае оставляем без изменения. У меня вопрос такой, можно сделать так, чтобы сделать
вставку не 0, а значения предыдущего числового значения.
Если, допустим, данный запрос вернет:
Index_data | Sum_
_____________________
20.10.2015 | 8
21.10.2015 | 2
22.10.2015 | NULL
23.10.2015 | 5
24.10.2015 | NULL
25.10.2015 | NULL
26.10.2015 | 6
Переделать его так:
Index_data | Sum_
_____________________
20.10.2015 | 8
21.10.2015 | 2
22.10.2015 | 2
23.10.2015 | 5
24.10.2015 | 5
25.10.2015 | 5
26.10.2015 | 6
Как это сделать? Хотел курсором перебрать, однако, хочется оформить это просто запросом
или вложенными запросами.
SELECT *,
CASE WHEN Sum_ IS NOT NULL THEN Sum_
ELSE COALESCE(Sum_, SELECT Sum_ FROM dbo.VIEW_1 WHERE ????)
END AS first_Non_Null
FROM dbo.VIEW_1;
GO
или как-то так:
DECLARE @val nvarchar(30);
SELECT *,
CASE WHEN Sum_ IS NOT NULL THEN Sum_
ELSE COALESCE(Sum_, Sum_.PREV....... )
END AS first_Non_Null
FROM dbo.VIEW_1;
GO
Такое возможно сделать?
Ответы
Ответ 1
Используйте функцию LAG: SELECT index_data, coalesce(Sum_, LAG(Sum_) OVER(ORDER BY index_data)) FROM dbo.VIEW_1;Ответ 2
Можно попробовать сделать через "хитрый" JOIN. У тебя есть запрос, который возвращает значения с NULL и значения без NULL. Можно попробовать с чем-то типа этого поиграть : JOIN table2 ON DATEADD(d,1,table2.date)=table1.date and DATEADD(d,1,table2.date) is not null
Комментариев нет:
Отправить комментарий