在单个查询中乘以行

时间:2017-12-27 13:24:18

标签: sql sql-server tsql sql-server-2014

表1 包含以下2列和4行:

Entity Number
------ ------
Car    4
Shop   1
Apple  3
Pear   1

我希望有一个基于SQL的查询集,它会产生以下所需的结果。基本上按“数字”列中的次数复制实体。

我只能通过逐行循环来实现,这不是很优雅,也不是基于设置。

期望的结果:

Entity
------
Car   
Car   
Car   
Car   
Shop  
Apple 
Apple 
Apple 
Pear  

4 个答案:

答案 0 :(得分:4)

一种方法使用递归CTE:

with cte as (
      select t1.entity, t1.number
      from table1 t1
      union all
      select cte.entity, cte.number - 1
      from cte
      where cte.number > 0
     )
select entity
from cte;

注意:使用默认设置,每个实体限制为100行。您可以使用OPTION (MAXRECURSION 0)解决此问题。

您也可以使用数字表解决此问题,但这样的问题是对递归CTE的一个很好的介绍。

答案 1 :(得分:2)

使用此

{{1}}

答案 2 :(得分:2)

非递归解决方案,将使用固定的序列号,然后根据此数字加入表格,如下所示:

WITH numbers
AS
(
  SELECT n
  FROM (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9), (10)) AS numbers(n)
)
SELECT t.Entity
FROM Table1 AS t
INNER JOIN numbers as n ON t.number >= n.n;

这将支持最多10次重复,您可以添加额外的数字以支持额外的重复时间。

Demo

答案 3 :(得分:1)

您可以使用spt_values作为数字表的来源

select EntityList.* 
from EntityList
, (
select number as n from master..spt_values WHERE Type = 'P' and Number between 1 and (select max(number) from EntityList)
) t
where n <= number
order by entity

enter image description here