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