Генерация строк на основе значения из столбца в другой таблице - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть следующая таблица:

EventID=00002,DocumentID=0005,EventDesc=ItemsReceived

У меня есть количество в другой таблице

DocumentID=0005,Qty=20

Я хочу получить результат из 20 строк (в зависимости от количества) савтоматически сгенерированный столбец, который будет иметь последовательность:

ITEM_TAG_001,
ITEM_TAG_002,
ITEM_TAG_003,
ITEM_TAG_004,
..
ITEM_TAG_020

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

Лучше всего представить таблицу чисел, очень красивую во многих местах ...

Что-то не так:

Создайте несколько тестовых данных:

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

1 голос
/ 23 сентября 2019

Вот ваш sql запрос.

with cte as (
    select 1 as ctr, t2.Qty, t1.EventID, t1.DocumentId, t1.EventDesc from tableA t1  
    inner join tableB t2 on t2.DocumentId = t1.DocumentId       
    union all 
    select ctr + 1, Qty, EventID, DocumentId, EventDesc  from cte
    where ctr <= Qty
)select *, concat('ITEM_TAG_', right('000'+ cast(ctr AS varchar(3)),3)) from cte
option (maxrecursion 0);

Вывод:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...