Есть таблица с одним полем, заполненным числами, допустим:
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
Комментариев нет:
Отправить комментарий