SQL: развертывание набора - PullRequest
2 голосов
/ 02 марта 2010

Предположим, у меня есть набор в SQL, подобный этому:

    Product | Quantity
       A         1
       B         2

Я хочу (в одном операторе SELECT) преобразовать это в:

    Product 
       A    
       B    
       B

Может кто-нибудь указать мне (желательно на T-SQL), на хитрость, как это сделать?

Ответы [ 3 ]

6 голосов
/ 02 марта 2010

Вам нужна таблица промежуточных чисел или табличная функция (если вам доступна эта опция), которая будет производить числа.

Предполагается, что у вас есть таблица чисел, которая заполняется следующим образом:

    Number
    ------
         1
         2
       ...
    100000

(или настолько большой, насколько вам нужно, и существует эффективных механизмов для создания таблицы чисел большого размера )

Затем вы выполните следующий запрос:

select
    p.Product
from
    Products as p
        inner join Numbers as n on n.Number <= p.Quantity 

Это даст желаемый результат.

Таблица чисел невероятно полезна в SQL, и Ицик Бен-Ган рассматривает ее и другие замечательные методы запросов в своих книгах (перечислены на его веб-сайте). Я настоятельно рекомендую их.

1 голос
/ 03 марта 2010
select ProductName, Quantity from Product

ProductName Количество


A 1

B 2

C 4

Вот один выбор, как вы хотите (SQL Server 2005):

with result (ProductName, Q)
as
(
    select ProductName, 1 from Product where Quantity > 0
    union all
    select p1.ProductName, result.q + 1 from Product p1
    inner join result on result.ProductName = p1.ProductName
    where result.q < p1.Quantity 
)
select p2.ProductName from Product p2
    inner join result on result.ProductName = p2.ProductName
order by 1
OPTION (MAXRECURSION 0);

ProductName

A
B
B
C
C
С * * тысяча двадцать-один С

0 голосов
/ 02 марта 2010

Попробовать КУРСОР ??

DECLARE @Cursor CURSOR
DECLARE @Product varchar(50)

SET @Cursor = CURSOR FOR
SELECT Product FROM dbo._YourTable

OPEN @Cursor

FETCH NEXT FROM @Cursor INTO @Product 

WHILE @@FETCH_STATUS = 0
BEGIN

DECLARE @Count int
SET @Count = 0

DECLARE @Quantity int
SET @Quantity = SELECT Quantity FROM dbo._YourTable WHERE Product = @Product

WHILE @Count < @Quantity
BEGIN

SELECT @Product as Product
@Count = @Count + 1

END

FETCH NEXT FROM @Cursor INTO @Product
END

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