sql - 根据另一个表中列的值生成行
问题描述
我有下表:
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
解决方案
最好是介绍一个数字表,很多地方都很帅……
伴随着一些东西:
创建一些测试数据:
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
简而言之:
我们使用 anINNER JOIN
来获取加入项目的数量。
现在我们使用APPLY
,这是一个按行操作,将尽可能多的行绑定到集合,因为我们需要它。
第一项将返回 5 行,第二项将返回 7 行。and 的技巧是创建填充数字的一种方法STR()
。REPLACE()
您可能会使用FORMAT()
(v2012+),但这工作相当缓慢......
该表@MockNumbers
是一个声明的表变量,其中包含从 1 到 100 的数字列表。此答案提供了一个示例,如何创建一个物理数字和日期表。任何数据库都应该有这样的表......
如果您不想创建数字表,您可以搜索计数表或即时计数。有很多答案显示了如何创建运行数字列表的方法......
推荐阅读
- php - 如何让 PHP 将我的变量视为数字?
- flutter - 如何在颤动中将周,月,年添加到日期
- jakarta-mail - 内容 ID 为空的电子邮件
- node.js - 将在nodejs中创建的exceljs工作簿数据保存到客户端(已解决)
- jquery - 如何将光滑的滑块全宽居中?
- nginx - Ansible:如果语法正常,重新加载 nginx 的快速方法?
- javascript - 单击 div 发出声音,并且同一个 div 链接到键盘声音...有可能吗?
- android - 如何在起点和终点之间绘制多条路线,googlemaps api?
- asp.net - 为集成测试隔离数据库操作
- python - 添加计数图总数并删除特定标签