Лучше всего представить таблицу чисел, очень красивую во многих местах ...
Что-то не так:
Создайте несколько тестовых данных:
DECLARE @MockNumbers TABLE(Number BIGINT);
DECLARE @YourTable1 TABLE(DocumentID INT,ItemTag VARCHAR(100),SomeText VARCHAR(100));
DECLARE @YourTable2 TABLE(DocumentID INT, Qty INT);
INSERT INTO @MockNumbers SELECT TOP 100 ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) FROM master..spt_values;
INSERT INTO @YourTable1 VALUES(1,'FirstItem','qty 5'),(2,'SecondItem','qty 7');
INSERT INTO @YourTable2 VALUES(1,5), (2,7);
-Запрос
SELECT CONCAT(t1.ItemTag,'_',REPLACE(STR(A.Number,3),' ','0'))
FROM @YourTable1 t1
INNER JOIN @YourTable2 t2 ON t1.DocumentID=t2.DocumentID
CROSS APPLY(SELECT Number FROM @MockNumbers WHERE Number BETWEEN 1 AND t2.Qty) A;
Результат
FirstItem_001
FirstItem_002
[...]
FirstItem_005
SecondItem_001
SecondItem_002
[...]
SecondItem_007
Идея вкратце:
Мы используем INNER JOIN
, чтобы получить количество, присоединенное к элементу.
Теперь мы используем APPLY
, то есть действие по строкам , чтобы привязать столько строк к набору, сколько нам нужно.
Первый элемент вернется с 5 строками, второй - с 7. И трюк с STR()
и REPLACE()
- один из способов создания дополненного числа.Вы можете использовать FORMAT()
(v2012 +), но это работает довольно медленно ...
Таблица @MockNumbers
является объявленной табличной переменной, содержащей список чисел от 1 до 100. Этот ответ предоставляет пример того, как создать таблицу чисел и даты.Любая база данных должна иметь такую таблицу ...
Если вы не хотите создавать таблицу чисел, вы можете искать таблицу подсчета или подсчет на лету .Есть много ответов, показывающих подходы, как создать список бегущих чисел ... a