#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
Комментариев нет:
Отправить комментарий