跪求sql server的语句练习语句(复杂点得)

小灰灰城堡 2019-09-26 10:03:02
我的sql 语句功底不是很好,所以想锻炼下,哪个大哥或者姐姐,又这样的题吗?我想练习下
...全文
179 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ChinaITOldMan 2019-09-27
  • 打赏
  • 举报
回复
上面这些对联系基本真的有点难
雨夹雪 2019-09-26
  • 打赏
  • 举报
回复
请编写一个存储过程,输入一个大于2的奇数(比如11),得到下图(横竖对角线和相等)

不晓得复杂度够不,按理难着不会,会者不难

exec sp_MSJZ 11


雨夹雪 2019-09-26
  • 打赏
  • 举报
回复
请编写一个存储过程,实现输入汉字,打印如下图像
雨夹雪 2019-09-26
  • 打赏
  • 举报
回复
输入一个数(比如8),得到如下查询结果:

文盲老顾 2019-09-26
  • 打赏
  • 举报
回复
有产品表product(id int identity,cid int,name nvarchar(50),pubtime datetime) 有企业表company(cid int identity,name nvarchar(50)) 有服务表company_service(sid int identity,cid int,service_type id,s_begin date,s_end date) 按照服务级别service_type倒序排列每个企业的产品 例如:a企业,有产品a1,a2,a3,级别为6,b企业,有产品b1,b2,级别为4,c企业,有产品c1,c2,c3,c4,c5 最终排序为 a1,b1,c1,a2,b2,c2,a3,c3,c4,c5
雨夹雪 2019-09-26
  • 打赏
  • 举报
回复

--1.建表
CREATE TABLE #T
(
id INT,
[name] VARCHAR(10),
[for] INT,
[left] INT,
[right] INT
)
--2.插入数据
INSERT INTO #T VALUES(1, '小小', 0, 3, 2)
INSERT INTO #T VALUES(4, '笑笑', 2, 8, 9)
INSERT INTO #T VALUES(5, '琦琦', 2, 13, 0)
INSERT INTO #T VALUES(2, '琪琪', 1, 5, 4)
INSERT INTO #T VALUES(3, '晓晓', 1, 6, 7)
INSERT INTO #T VALUES(6, '兵兵', 3, 10, 11)
INSERT INTO #T VALUES(7, '冰冰', 5, 0, 12)
INSERT INTO #T VALUES(8, '公主', 4, 0, 0)
INSERT INTO #T VALUES(9, '筱筱', 4, 0, 0)
INSERT INTO #T VALUES(10, '姗姗', 6, 0, 0)
INSERT INTO #T VALUES(11, '珊珊', 6, 0, 0)
INSERT INTO #T VALUES(12, '微微', 7, 0, 0)
INSERT INTO #T VALUES(13, '薇薇', 5, 0, 0)


根据上面的数据,查询得到下图
雨夹雪 2019-09-26
  • 打赏
  • 举报
回复
那个魔术矩阵的
是先创建N行N列的表,多加一列id列,并插入N行数据
然后开始开始填充数据
首先在最上面一行的中央填入1
然后以递增的顺序将后面的数字放入上面一行靠右一列的方格中
这种放置是可以环绕的,当下一个计算出来的位置的行数超出最上面一行的时候
就返回下一行,列数超出最右边就返回最左边,按此计算方法
如果计算出来的下一个位置已经被填充,就将下一个位置改为前一个位置的正下方
直到N*N


雨夹雪 2019-09-26
  • 打赏
  • 举报
回复

--这个是先创建计算排列和组合的函数,然后语句里计算每个点的值和位置,再行列转换得到结果
Declare @A int=8;
Declare @w nVarchar(3000)=''
Declare @s nVarchar(3000)=''
Declare @sql nvarchar(4000)=''

Select
@w=@w+',['+number+']',
@s=@s+',isnull(['+number+'],'''') As ['+number+']'
From
(
Select convert(Varchar(10),number) As number
From master.dbo.spt_values
Where type='P' and number between 1 and 2*(@A+1)
) S

Set @sql=
'
With T
As
(
Select number From master.dbo.spt_values
Where type=''P'' And number between 1 and @A+1
)
Select '+Stuff(@s,1,1,'')+' From
(
Select A.number*2+@A-B.number As A,B.number As B,
Convert(Varchar(10),nullif(dbo.fn_c(A.number-1,b.number),0)) As C
From T A cross join T B
Where b.number<=@A
) s
Pivot
(
max(c)
for
A in('+Stuff(@w,1,1,'') +')
)p'

exec sp_executesql @sql,N'@A int',@A

--排列
Create Function fn_p(@I int)
Returns int
As
Begin
Declare @Rst int=1
While @I>0
Begin
Set @Rst=@Rst*@I
Set @I=@I-1
End
Return @Rst
end
go
--组合
Create Function fn_c(@n int,@m int)
Returns int
As
Begin
return dbo.fn_p(@m)/(dbo.fn_p(@n)*dbo.fn_p(@m-@N))
End
go


文盲老顾 2019-09-26
  • 打赏
  • 举报
回复
引用 1 楼 雨夹雪 的回复:

 --1.建表
CREATE TABLE #T
(
 id INT,
 [name] VARCHAR(10),
 [for] INT,
 [left] INT,
 [right] INT
)
--2.插入数据 
INSERT INTO #T VALUES(1, '小小', 0, 3, 2)
INSERT INTO #T VALUES(4, '笑笑', 2, 8, 9)
INSERT INTO #T VALUES(5, '琦琦', 2, 13, 0)
INSERT INTO #T VALUES(2, '琪琪', 1, 5, 4)
INSERT INTO #T VALUES(3, '晓晓', 1, 6, 7)
INSERT INTO #T VALUES(6, '兵兵', 3, 10, 11)
INSERT INTO #T VALUES(7, '冰冰', 5, 0, 12)
INSERT INTO #T VALUES(8, '公主', 4, 0, 0)
INSERT INTO #T VALUES(9, '筱筱', 4, 0, 0)
INSERT INTO #T VALUES(10, '姗姗',  6, 0, 0)
INSERT INTO #T VALUES(11, '珊珊',  6, 0, 0)
INSERT INTO #T VALUES(12, '微微',  7, 0, 0) 
INSERT INTO #T VALUES(13, '薇薇',  5, 0, 0)
根据上面的数据,查询得到下图
这玩意完全没说明。。。。猜了半天才猜明白left和right干嘛的。。。
with t as (
	select id,name,[for] f,[left] l,[right] r from #t
),t1 as (
	select a.*,isnull(c.id,isnull(b.id,0)) as parent from t a
	left join t b on a.id=b.l
	left join t c on a.id=c.r
),t2 as (
	select *,0 as lv,0 as loc from t1 where parent=0
	union all
	select a.*,lv+1,(case when a.id=b.l then -1*power(2,2-lv) else power(2,2-lv) end)+b.loc from t1 a,t2 b where a.parent=b.id
),t3 as (
	select lv+1 as id,loc+abs((select min(loc) from t2))+1 as loc,name from t2
)
select isnull([1],'') as [1],isnull([2],'') as [2],isnull([3],'') as [3],isnull([4],'') as [4],isnull([5],'') as [5],isnull([6],'') as [6],isnull([7],'') as [7],isnull([8],'') as [8]
	,[9],[10],[11],[12],[13],[14],[15] 
from t3
pivot(
	max(name) for loc in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15])
) p
问题是有个小疑问啊,如果我不知道最终有多少数据,那么行列转换这里必须用exec了,不能一个语句实现,另外就是,如果不知道有多少层,t2里的power的初始量也有问题啊 给个答案,让我参考下
stelf 2019-09-26
  • 打赏
  • 举报
回复
楼主不要忘了把最后的sql语句贴出来,给其他人学习下也是好的
stelf 2019-09-26
  • 打赏
  • 举报
回复
杨辉三角形?兔子数列,九九乘法表,等等
引用 3 楼 雨夹雪 的回复:
输入一个数(比如8),得到如下查询结果:

34,576

社区成员

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

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