今天来个杨辉三角

anzhiqiang_touzi 2012-06-01 06:00:13
加精


declare @SQL varchar(max)
declare @INSERT varchar(max)
declare @Update varchar(max)
declare @n int
set @n=8

set @SQL='SELECT'
set @INSERT=''
set @Update=''

select @SQL=@SQL+C,@INSERT=@INSERT+I from
(
select case when number<>@n+1 Then ' NULL as ['+CAST(number as varchar)+'],' else ' 1 as ['+CAST(number as varchar)+'],' end as C,
case when (@n+1-number)>0 Then ' INSERT INTO #t(['+CAST(@n+1-number as varchar)+'],['+CAST(@n+1+number as varchar)+'],ID) VALUES(1,1,'+CAST(number+1 as varchar)+')' else '' end as I
from master..spt_values where type='P' and number BETWEEN 1 and @n*2+1
)a

select @Update=@Update+' Update #T set '+
(
select '['+CAST(number as varchar)+']=(select top 1 (CAST(['+CAST(number-1 as varchar)+'] as int)+CAST(['+CAST(number+1 as varchar)+'] as int)) from #t a where a.ID=#t.ID-1),'+''
from master..spt_values a where type='P' and number BETWEEN aa.Min and aa.Max order by number desc for xml path('')
)+' ID=ID where ID='+CAST(number as varchar)
from
(
select number+3 as number,
case when (@n+1-number)>0 Then @n+1-number else '' end as Min,
case when (@n+1-number)>0 Then @n+1+number else '' end as Max
from master..spt_values where type='P' and number+3 BETWEEN 0 and @n+2-1
)aa
set @SQL=@SQL+' 1 as ID INTO #t alter table #t alter column ['+CAST(@n+1 as varchar)+'] Int '+@INSERT+' '+@Update+' select * from #t order by ID'
exec(@SQL)
...全文
6427 127 打赏 收藏 转发到动态 举报
写回复
用AI写文章
127 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanian 2014-04-07
  • 打赏
  • 举报
回复
无涯大者 2013-04-06
  • 打赏
  • 举报
回复
杨辉三角。学习
hokecoko 2013-04-06
  • 打赏
  • 举报
回复
好强大啊,第一次知道sql还可以这么玩,学习了
Andy-W 2013-04-03
  • 打赏
  • 举报
回复
use tempdb
go
set nocount on
declare @n int=10, --行数,根据实际来控制
@x int=1,@y int=1,@sql nvarchar(1000)=''

/*
绘制方法:先根据行数@n,构造表格#,再根据杨辉三角形的组合数性质(第n行的第m个数和第n-m+1个数相等,即C(n-1,m-1)=C(n-1,n-m) )绘制结果数据
参照:http://baike.baidu.com/view/7804.htm
*/

if object_id('#') is not null drop table #
create table #([1] nvarchar(50) not null default(''))

while @x<@n*2-1
begin
set @x+=1
set @sql='alter table # add '+quotename(@x)+' nvarchar(50) not null default('''');'
exec( @sql)

if @x>((@n*2.-1)/2)
begin
set @sql='insert into #('+quotename(@x)+') values(1)'
exec(@sql)
set @y=1
while @y<=( @x-@n)
begin
set @sql='update a set '+quotename(@x-@y*2)+'='+
case when @x-@y*2-1=0 then '0' else 'convert(int,b.'+quotename(@x-@y*2-1)+')' end +'+'+
case when @x-@y*2+1=@n*2.-1 then '0' else 'convert(int,b.'+quotename(@x-@y*2+1)+')' end +' from # a join # b on b.'+quotename(@x-1)+'=1 where a.'+quotename(@x)+'=1'
exec(@sql)
set @y+=1
end
end
end
select * from #






---涛声依旧--- 2013-04-02
  • 打赏
  • 举报
回复
牛!
xiaoxiangqing 2012-11-02
  • 打赏
  • 举报
回复
不错,学习下
秀HAPPY 2012-11-02
  • 打赏
  • 举报
回复
满好玩滴!牛人啊!
anzhiqiang_touzi 2012-11-01
  • 打赏
  • 举报
回复
今天心情好来我来顶顶
zx6121390 2012-06-16
  • 打赏
  • 举报
回复
让我想起来刚学java的时候写的乘法口诀表了~!正的反的~!
yxhshuaiman 2012-06-14
  • 打赏
  • 举报
回复
看来确实流行写这个 现在是写杨辉 下次写下华罗庚吧!
大海上飞翔 2012-06-14
  • 打赏
  • 举报
回复
不佩服不行呀!sql技巧很高呀
WarOfTheKing 2012-06-11
  • 打赏
  • 举报
回复
我曾经用java打了杨辉三角的,比较简单,sql还没试过。
珞珈 2012-06-11
  • 打赏
  • 举报
回复
不是很理解其中的意思。还的好好学习呀
visioncoder 2012-06-10
  • 打赏
  • 举报
回复
童鞋们,你们知道回字的四种写法吗?
JIACISCO 2012-06-10
  • 打赏
  • 举报
回复
强大!好好学习下了!
flycode310 2012-06-10
  • 打赏
  • 举报
回复
怎么没有截图呀
coclocq 2012-06-10
  • 打赏
  • 举报
回复
哇,楼主犀利,学生来观摩学习下
jacharyin 2012-06-09
  • 打赏
  • 举报
回复
经典题目哈
yunzhongyouyun3615 2012-06-08
  • 打赏
  • 举报
回复
楼主好牛!!!有时间交流一下!!
zkyEric 2012-06-08
  • 打赏
  • 举报
回复
运行了一下,OK!!!
加载更多回复(71)

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧