Sql 将值转换为单数行

Sql 将值转换为单数行,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,当前 要求的结果 Name Quantity --------------- Stella 2 Jennifer 2 Greg 3 我该怎么做 Name Quantity --------------- Stella 1 Stella 1 Jennifer 1 Jennifer 1 Greg 1 Greg 1 Greg 1 您可能需要一个预填充的数字表

当前

要求的结果

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')

这是您可以做到的,但我不确定您为什么要这样做。

如果已知数量列中的最大值小于32767,您可以使用递归生成数字,并将这些数字合并以获得结果

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

使用递归并借用Michael Fredrickson的设置代码:

/*******************************************
  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);

根据查询计划,这似乎比Michael Fredrickson的要快5倍,但逻辑读取更多,这并不重要。

你可以超过100次。参见MAXRECURSION@TimLehner:谢谢你让我知道。我将更新答案。您也可以使用MAXRECURSION 0转到无穷大:@蒂姆莱纳:很高兴知道。可能是用户可以根据自己的需要限制最大递归:@NikolaMarkovinović:不需要,因为CTE在定义中定义了列名!SQL最适合处理关系数据。结果不是关系,因为它包含重复的行。
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