Learn.net37 Ответов: 1

Генерация чисел от 0001 до 9000 в столбце и цикл для другого столбца


Здравствуйте у меня есть таблица с 2 столбцами я хочу чтобы один генерировал числа от 0001 до 9000 в этом формате номер и второй на основе первого столбца как каждые 50 чисел из первого столбца это 1 и второй 50 это 2

Забронировать Без Чека Нет
1 0001-0050
2 0051-0100
3 0101-0150


как и этот ОФК это будут огромные данные но они мне нужны

спасибо тебе

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

до сих пор не знаю, как я могу это сделать

CHill60

Кстати, это не будут огромные данные - это будет всего 180 строк - 9000/50

1 Ответов

Рейтинг:
10

CHill60

Чтобы сгенерировать последовательность см. Генерация последовательности в SQL[^]
Для первого столбца [книга нет] используйте столбец идентификаторов:

CREATE TABLE Book
(
	[Book No] int identity(1,1),
	[Receipt No] varchar(9)
)
Для второго столбца используйте средства генерации последовательности, отформатируйте ее (кстати, это плохая практика) и вставьте в таблицу вот так
;WITH q AS
(
    SELECT  1 AS num
    UNION ALL
    SELECT  num + 50
    FROM    q
    WHERE num < 9000 - 49
)
INSERT INTO Book
SELECT  FORMAT(num,'000#') + '-' + FORMAT(num + 49, '000#') -- SQL 2012 or greater 
--SELECT RIGHT('0000'+CAST(num AS VARCHAR(4)),4) + '-' + RIGHT('0000'+CAST(num + 49 AS VARCHAR(4)),4)		-- SQL 2008 or earlier
FROM    q
OPTION (MAXRECURSION 180) -- 900 / 50
Примечание. Если вы используете версию SQL ранее 2012 года, вам нужно будет заменить последний выбор на тот, который указан в комментарии.

[Отредактировано, чтобы убедиться, что максимальное число равно 9000, а не 9049]

[EDIT 2] OP пересмотрел свои требования
CREATE TABLE Book
(
	[Book No] int,
	[Receipt No] int
)

;WITH q AS
(
    SELECT  1 AS num
    UNION ALL
    SELECT  num + 1
    FROM    q
    WHERE num < 9000 
), q2 as
(
	SELECT 1 as num2
	UNION ALL
	SELECT num2 + 1
	FROM q2
	WHERE num2 < 50
)
INSERT INTO Book
SELECT  Q.num, Q2.num2
FROM    q CROSS JOIN q2
OPTION (MAXRECURSION 9000)


SELECT * from Book
order by [Book No], [Receipt No]


[Правка 3] ... появилось несколько лучшее описание требований:
;WITH q AS
(
    SELECT  1 AS num
    UNION ALL
    SELECT  num + 1
    FROM    q
    WHERE num < 9000 
)
SELECT  num, FORMAT(NTILE(9000/50) OVER(ORDER BY num),'000#') AS Receipt
FROM    q 
ORDER BY num
OPTION (MAXRECURSION 9000)


Learn.net37

спасибо вам сэр но мне нужно получить доступ как 45 и т. д.
пример: ur code book recp
1 1-50

я хочу книгу recp
1 1
1 2
1 3
1 4
1 -
1 -
1 -
1 -
- -
1 50
2 51
и так далее

Learn.net37

я знаю, что это не очень хорошо, но плз мне это нужно , и вставка будет зависеть от recp no, так что все в порядке

CHill60

Я обновил свое решение. Если это все еще не то, что вам нужно, тогда четко опишите проблему.

Learn.net37

сэр когда его достигнет книга 2
бок отдых
2 1

rec снова идет 1, а не 51

и формат номер 1 не 0001 в recp

CHill60

Я снова обновил свое решение. .. что касается формата, то я уже показал вам, как это сделать.
Однако вам следует обдумать один вопрос... что происходит, когда вы продаете 51 экземпляр книги 1 ... вы не сможете выставить счет за него

Learn.net37

это как книга квитанции каждая книга имеет 50 квитанций, так что же мне делать, если у меня есть 33 книги с началом 1 до сих пор 1600 квитанций, и я хочу попытаться связать одну с какими-то другими записями или найти то, чего не хватает, и скажите мне, есть ли хорошая идея рядом с этим?

CHill60

Теперь я понимаю, чего вы добивались!
Вы правы, запросив эту таблицу с левым внешним соединением к таблице, содержащей" использованные " записи, вы можете определить, чего не хватает, ища нулевые значения, возвращаемые для объединенной таблицы.

CHill60

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

CHill60

Возможно, вы захотите удалить его до того, как его найдут спам-боты

Learn.net37

последнее редактирование говорит мне формат в недопустимой функции, потому что, возможно, я использую 2008

CHill60

Тогда используйте альтернативу, которую я показал вам ранее

RIGHT('0000'+CAST(FORMAT(NTILE(9000/50) OVER(ORDER BY num)AS VARCHAR(4)),4)

Maciej Los

5ед!