拥有一系列数字,创建一个金字塔

时间:2017-03-02 15:46:59

标签: tsql sql-server-2012

是否可能有一系列数字,例如:

  

1,2,3,4,5

创建/打印金字塔,如:

  

1
  1,2   1,2,3   1,2,3,4   1,2,3,4,5

这可以通过循环轻松完成,但我想避免使用它们。

到目前为止,我的解决方案是动态创建每一行的选择字符串,并union所有行以获得所需的结果。例如:

-- @Line1 = '1, 
select @Line1 = coalesce(@Line1 + ',', '') + Num 
  from Numbers
 where Num < 2

-- @Line2 = '1, 2,'
select @Line2 = coalesce(@Line2 + ',', '') + Num 
  from Numbers
 where Num < 3

select @Line1
union
select @Line2
.
.
.

并执行它。代码不完整,但我认为它给出了我正在尝试的内容。

关于如何改进它的任何想法?

相关:How do I print a triangle of stars using SQL

注意:这可能没有实际用途。我发现这是一种各种语言的练习,所有人都提出了循环解决方案。我认为在SQL Server中尝试它会很有趣。

3 个答案:

答案 0 :(得分:3)

试试这个

WITH Numbers AS 
(
    SELECT TOP 5 
           ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS Nr 
    FROM master..spt_values
) 
SELECT STUFF(
            (
            SELECT ',' + CAST(x.Nr AS VARCHAR(10)) 
            FROM Numbers AS x 
            WHERE x.Nr<=Numbers.Nr
            FOR XML PATH('')
            ),1,1,''
            ) AS Result
FROM Numbers

结果

Result
1
1,2
1,2,3
1,2,3,4
1,2,3,4,5

答案 1 :(得分:3)

如果您有以下内容,这相对容易:

  • A Numbers table,即包含从1到某个大数字和
  • 的数字的表格
  • 可以concatenate rows的聚合函数。这样的函数STRING_AGG将添加到下一版本的SQL Server中(即 2016之后的)。有各种技术来创造这样的功能。链接的文章显示了各种选项,使用SQLCLR,XML运算符,CTE,游标等。fastes方法是SQLCLR。

假设连接方法是GROUP_CONCAT(),您可以写:

select o.n,dbo.GROUP_CONCAT_S(x.n) as Result
from numbers  o outer apply (select n from numbers i where i.n<=o.n) x
where o.n<=5
group by o.n

这将返回:

n           Result
----------- ----------
1           1
2           1,2
3           1,2,3
4           1,2,3,4
5           1,2,3,4,5

答案 2 :(得分:2)

我将此作为第二个答案,因为这是一种完全不同的方法:

递归CTE只不过是隐藏RBAR (所以隐形循环)。但它是 - 嗯 - 嗯 - 更漂亮: - )

$(".producttable").click