TSQL:如何根据单元格中的数字将行拆分为多行

问题描述 投票:0回答:3

我想创建一个基于单元格“ 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
sql-server tsql view
3个回答
1
投票

您可以这样做:

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


0
投票

我将使用一个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;

0
投票

您也可以使用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

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.