SQL Server 关于一个表格结构的另外一种显示(表达意思不变)
2022-11-12 09:50:45
内容摘要
这篇文章主要为大家详细介绍了SQL Server 关于一个表格结构的另外一种显示(表达意思不变),具有一定的参考价值,可以用来参考一下。
对此感兴趣的朋友,看看idc笔记做的技术笔记
文章正文
这篇文章主要为大家详细介绍了SQL Server 关于一个表格结构的另外一种显示(表达意思不变),具有一定的参考价值,可以用来参考一下。
对此感兴趣的朋友,看看idc笔记做的技术笔记!
一、需求由于表达能力不好,直接上图。在mssql环境中需要把图1的表转化成图2的表:
【图片暂缺】 图1 【图片暂缺】图2
二、分析【图片暂缺】
图3
2.1创建表
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <code>create table #tb (ID int primary key, Class nvarchar(max), [Subject] nvarchar(max), Score int) insert into #tb values(1, '一(1)班' , '语文' , '92' ) insert into #tb values(2, '一(1)班' , '数学' , '91' ) insert into #tb values(3, '一(1)班' , '英语' , '93' ) insert into #tb values(4, '一(2)班' , '数学' , '94' ) insert into #tb values(5, '一(2)班' , '语文' , '95' ) insert into #tb values(6, '一(2)班' , '英语' , '96' ) insert into #tb values(7, '一(3)班' , '数学' , '94' ) insert into #tb values(8, '一(3)班' , '语文' , '96' ) insert into #tb values(9, '一(3)班' , '英语' , '97' ) select * from #tb </code> |
代码如下:
1 2 3 4 5 | <code>select [Subject], [一(1)班]=[Score] ,[一(2)班]=[Score] ,[一(3)班]=[Score] from #tb </code> |
代码如下:
1 2 3 4 5 6 7 8 | <code>--观察第二张表,表显然很多成绩是错误的,所以要消除错误 --消除错误的方法:先把错误的成绩设置为0,然后每一行取最大的数作为成绩,并按照科目来分组显示 select subject,[一(1)班]= case when [Class]= '一(1)班' then [Score] else 0 end ,[一(2)班]= case when [Class]= '一(2)班' then [Score] else 0 end ,[一(3)班]= case when [Class]= '一(3)班' then [Score] else 0 end from #tb </code> |
代码如下:
1 2 3 4 5 | <code>select subject, [一(1)班]=max( case when [Class]= '一(1)班' then [Score] else 0 end ) ,[一(2)班]=max( case when [Class]= '一(2)班' then [Score] else 0 end ) ,[一(3)班]=max( case when [Class]= '一(3)班' then [Score] else 0 end ) from #tb group by subject </code> |
代码如下:
1 2 3 4 5 6 7 | <code> declare @s nvarchar(4000) set @s= '' Select @s=@s+ ',' +quotename(Class)+ '=max( case when [Class]=' +quotename(Class, '' '' )+ ' then [Score] else 0 end)' from #tb group by Class -- print @s exec ( 'select [Subject]' +@s+ ' from #tb group by [Subject]' ) </code> |
上面的简化,对于菜鸟级的我,理解着还是非常吃力的,所以我是在知道答案后,用 print @s一步一步的去分析的,特别是在select @s=@s+.....的时间,在这里我找到了一种把单列数据连接成字符串的方法。
【图片暂缺】
图4
3.2需求延伸或许上面的需求太简单,那么我们现在引出复杂点的需求,动态获取班级的成绩,比如我们的需求可能是列出部分班级的成绩,代码如下:
代码如下:
1 2 3 4 5 6 7 8 9 | <code> declare @s nvarchar(4000) set @s= '' Select @s=@s+ ',' +quotename(Class)+ '=max( case when [Class]=' +quotename(Class, '' '' )+ ' then [Score] else 0 end)' from #tb where Class in(你想要的班级) group by Class -- print @s exec ( 'select [Subject]' +@s+ ' from #tb group by [Subject]' ) </code> |
本文主要实现表的另外一种显示,通常用于动态显示数据的例子中。难点在于分析过程和一些基本的sql语法。
注:关于SQL Server 关于一个表格结构的另外一种显示(表达意思不变)的内容就先介绍到这里,更多相关文章的可以留意
代码注释