Страницы

Поиск по вопросам

пятница, 1 марта 2019 г.

Пропущенные числа в таблице

Есть таблица с одним полем, заполненным числами, допустим:
1, 2, 3, 5, 7, 11, 12, 13, 22, 24, 25
Нужно создать запрос, результатом которого будет таблица с полем, содержащим те же числа, но что бы пропущенные числа заменялись, например нулём. То есть:
1, 2, 3, 0, 5, 0, 7, 0, 0, 0, 11, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 24, 25
Я не слишком хорош в SQL, поэтому, по возможности, предложите не слишком сложное решение.


Ответ

В "With" cоздали последовательность от 1 до 100, ограничили ее минимальным и максимальным значением из таблицы datatable.
Соединили последовательность с datatable левым внешним соединением. в строках, где последовательность не нашла значение num в таблице datatable, datatable.num будет null, заменяем null на 0, результат вставляем в othertable.

create table datatable (num int); GO

create table othertable (num int); GO

insert into datatable (num) values (1), (2), (3), (5), (7), (11), (12), (13), (22), (24), (25); GO

with TblSeq as ( select 10*t1.n + t2.n + 1 as "num" from ( (select 0 n union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9 ) t1 cross join (select 0 n union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9 ) t2 ) where 10*t1.n + t2.n + 1 between (select min(num) from datatable) and (select max(num) from datatable) ) insert into othertable (num) select (case when datatable.num is null then 0 else datatable.num end) num from TblSeq left outer join datatable on TblSeq.num = datatable.num
GO
25 rows affected

select * from othertable GO
| num | | --: | | 1 | | 2 | | 3 | | 0 | | 5 | | 0 | | 7 | | 0 | | 0 | | 0 | | 11 | | 12 | | 13 | | 0 | | 0 | | 0 | | 0 | | 0 | | 0 | | 0 | | 0 | | 22 | | 0 | | 24 | | 25 |
db<>fiddle here

Комментариев нет:

Отправить комментарий