Ravikumarkkp Ответов: 2

Как добавить отсутствующий порядковый номер в таблицу SQL server


У меня есть таблица с данными ,в Столбцах недель отсутствует какой-то порядковый номер(неделя).
В этом месте я хочу добавить недостающее число.

например:

Columns :  week  year platformname operatingsystem
            1    2018        sql         w7
            2    2018        sql         w7 
            5    2018        sql         w7
            6    2018        sql         w7


в этих данных отсутствует число 3,4 .как добавить эти данные в таблицу.

Пожалуйста, помогите мне как можно скорее.

Заранее спасибо.

Что я уже пробовал:

я попробовал порядковый номер, но он пришел только 3 (только 1-й номер)

OriginalGriff

Это не очень хороший вопрос - мы не можем понять из этого малого, что вы пытаетесь сделать.
Помните, что мы не можем видеть ваш экран, получить доступ к вашему жесткому диску или прочитать ваши мысли - мы получаем только то, что вы печатаете для работы.
Итак, покажите нам входные данные, которые у вас есть, и выходные данные, которые вы хотите, покажите нам код, который генерирует выходные данные выше, и объясните, что с ним не так.

И не говорите нам, что вам это нужно как можно скорее: все хотят быстрого ответа, и вы не наш босс. Поэтому, действуя так, как будто это не поможет вам получить более быстрый ответ, это просто заставит вас выглядеть высокомерным ...
Используйте виджет "улучшить вопрос", чтобы отредактировать свой вопрос и предоставить более подробную информацию.

2 Ответов

Рейтинг:
13

Maciej Los

5ed!

0x01AA

Спасибо, Мацей. Честно говоря, по крайней мере одна из ссылок, которые я отметил в прошлом из одного из ваших ответов ;)

Maciej Los

;)

Рейтинг:
0

CHill60

Принцип заключается в том, что вам нужно выбрать непрерывный список чисел, а затем сопоставить их с данными, которые вы имеете в своей таблице.

Вот ваши данные

declare @demo table ([week] int, [year] int, platformname nvarchar(30), operatingsystem nvarchar(30))
insert into @demo ([week], [year], platformname, operatingsystem) values
(1, 2018, 'sql', 'w7'),(2, 2018, 'sql', 'w7'), 
(5, 2018, 'sql', 'w7'),(6, 2018, 'sql', 'w7')
Как вы говорите, там, где должны быть 3 и 4, есть промежуток.

Вот аккуратный и эффективный способ генерации всех чисел, которые вы хотите
select * from 
(select top (@top) row_number() over (order by  a.object_id) AS seqNum 
from sys.columns a) as nums
Этот запрос использует системную таблицу sys.columns только потому, что я знаю, что там будут некоторые данные, вероятно, довольно много в зависимости от моей схемы базы данных. В моем случае в моей базе данных есть 1167 столбцов, но если этого недостаточно, вы можете использовать cross join к той же таблице, чтобы получить еще больше чисел - 1361889 в моем случае, то есть 1167 х 1167

Таким образом я не получил 1361883 пустых строк в своих результатах я ограничил количество чисел которые я хочу использовать top (@top) где
declare @top int = (select max([week]) from @demo)
Я мог бы так же легко жестко закодировать это до 10, например.

Объедините два запроса с левым внешним соединением используя таблицу чисел в качестве левой таблицы и таблицу данных в качестве правой таблицы т. е.
select nums.seqNum, [year], platformname, operatingsystem
from 
  (select top (@top) row_number() over (order by  a.object_id) AS seqNum 
  from sys.columns a cross join sys.columns b)  as nums
left outer join @demo  on seqNum = [week]
что и дает результаты
seqNum	year	platformname	operatingsystem
1	2018	sql		w7
2	2018	sql		w7
3	NULL	NULL		NULL
4	NULL	NULL		NULL
5	2018	sql		w7
6	2018	sql		w7
Вам придется решить, что делать с нулевыми значениями


0x01AA

Вау, отличное компактное и простое объяснение. +5

CHill60

Спасибо! Я очень смущен перекрестным соединением - у меня был аналогичный запрос, который работал целую вечность, пока количество требуемых строк не превысило количество столбцов в моей схеме. Примерно тогда я начал настаивать на таблице чисел в нашей базе данных :-)

Maciej Los

5ed!