Превратить значение в единственном ряду - PullRequest
5 голосов
/ 23 марта 2012

Ток

Name   Quantity
---------------
Stella       2
Jennifer     2
Greg         3 

Запрошенный результат

Name    Quantity 
---------------
Stella       1
Stella       1
Jennifer     1
Jennifer     1
Greg         1
Greg         1 
Greg         1 

Как мне это сделать?

declare @T table  
(  
  Name varchar(50),  
  Sales int  
)  
insert into @T values  
('Stella',   '2'),  
('Jennifer', '2'), 
('Greg',     '3')

Ответы [ 3 ]

4 голосов
/ 23 марта 2012

Если известно, что максимальное значение в столбце quantity меньше 32 767, вы можете использовать Recursion для генерации чисел и объединения чисел для достижения вашего результата.

/*******************************************
  Max Recursion Count in SQL Server is 32767
  Limitation of 32767 Numbers!
 ******************************************/
;WITH Numbers (Number) AS 
(
    SELECT 1 
    UNION ALL
    SELECT 1 + Number FROM Numbers WHERE Number < 100
)
SELECT  m.Name,
        Quantity = 1
  FROM  MyTable m 
        JOIN @numbers n ON m.Quantity <= n.Number
OPTION (MAXRECURSION  32767);
2 голосов
/ 23 марта 2012

Использование рекурсии и заимствование установочного кода Майкла Фредриксона:

declare @T table (  
  Name varchar(50),  
  Sales int  
)

insert into @T values ('Stella',   '2')  
insert into @T values ('Jennifer', '2') 
insert into @T values ('Greg',     '3')

-- Recursive verion
;with People (Name, Sales) as
(
    select Name, Sales
    from @T
    union all
    select Name, Sales - 1
    from People
    where Sales - 1 > 0
)
select Name, 1 as Quantity
from People
option (maxrecursion 0) -- Recurse without limit

На моем компьютере это работает быстрее (в 5 раз быстрее, чем у Майкла Фредриксона согласно плану запросов, но с большим количеством логических операций чтения), не такэто имеет большое значение.

2 голосов
/ 23 марта 2012

Возможно, вы захотите иметь предварительно заполненную таблицу чисел, чтобы сделать это:

declare @T table (  
  Name varchar(50),  
  Sales int  
)  

declare @numbers table (
  Number int
)

insert into @numbers values (1)
insert into @numbers values (2)
insert into @numbers values (3)
insert into @numbers values (4)
-- Etc... up to however many numbers is the max possible value for sales...

insert into @T values ('Stella',   '2')  
insert into @T values ('Jennifer', '2') 
insert into @T values ('Greg',     '3')

SELECT
    t.Name,
    1 AS Sales
FROM
    @T t JOIN
    @numbers n ON
        t.Sales >= n.Number
ORDER BY t.Name

Вот как вы могли бы это сделать, но я не уверен на почему Вы хотели бы сделать это.

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