我想创建一个基于单元格“ QTY”中的数字拆分行的视图
行1在单元格“ QTY”中的值为1,应在1行中显示第2行在单元格“ QTY”中的值为2,应产生2行第3行的单元格“ QTY”中的值为4,应产生4行
我的桌子
QTY ITEM
1 | aaa
2 | bbb
4 | ccc
我的结果应该看起来像这样
QTY ITEM
1 | aaa
2 | bbb
2 | bbb
4 | ccc
4 | ccc
4 | ccc
4 | ccc
创建表
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[mytable](
[QTY] [int] NULL,
[Item] [nchar](10) NULL
) ON [PRIMARY]
GO
INSERT [dbo].[mytable] ([QTY], [Item]) VALUES (1, N'aaa ')
GO
INSERT [dbo].[mytable] ([QTY], [Item]) VALUES (2, N'bbb ')
GO
INSERT [dbo].[mytable] ([QTY], [Item]) VALUES (4, N'ccc ')
GO
您可以这样做:
SELECT T.*
FROM
(
VALUES
(1, 'aaa'),
(2, 'bbb'),
(4, 'ccc')
) T(Qty, Item) CROSS APPLY
(
SELECT Number
FROM Master..SPT_VALUES
WHERE TYPE = 'P' AND Number > 0 AND Number <= T.Qty
) TT(N)
注意:您可以用演播表代替master..spt_values
。
我将使用一个Tally执行此操作,然后JOIN
上的No
大于或等于Tally中的值:
WITH N AS(
SELECT N
FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
SELECT TOP(SELECT MAX([No]) FROM dbo.mytable) --if 185 isn't to change, then I would replace the sub query with 185
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
FROM N N1, N N2, N N3) --216 rows, add more Ns here, or more NULLs above to make larger
SELECT mt.[No] AS QTY,
mt.Item
FROM dbo.mytable mt
JOIN Tally T ON mt.[No] >= T.I;
您也可以使用master.dbo.spt_values
尝试此解决方案。
create table MyTable (QTY int, ITEM varchar(10))
insert into MyTable Values
(1, 'aaa'),
(2, 'bbb'),
(4, 'ccc')
SELECT t1.*, t2.number + 1 RepeatNumber
FROM MyTable t1
JOIN master.dbo.spt_values t2 ON t2.type = 'P' AND t2.number < t1.QTY
这里是演示,位于:db<>fiddle