T SQL: как разбить строку на несколько строк на основе числа в ячейке - PullRequest
1 голос
/ 21 февраля 2020

Я хочу создать представление, которое разбивает строку на основе числа в ячейке "QTY"

Строка 1 имеет значение 1 в ячейке "QTY" и должна приводить к 1 строке
Строка 2 имеет значение 2 в ячейке "QTY" и должно иметь 2 строки
Строка 3 имеет значение 4 в ячейке "QTY" и должно содержать 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

Ответы [ 3 ]

1 голос
/ 21 февраля 2020

Вы можете сделать как:

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 голосов
/ 21 февраля 2020

Вы можете попробовать это решение также, используя 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

0 голосов
/ 21 февраля 2020

Я бы использовал 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;
...