SQL Server table 行转列的sql分析

2022-11-12 09:48:26
内容摘要
这篇文章主要为大家详细介绍了SQL Server table 行转列的sql分析,具有一定的参考价值,可以用来参考一下。 对此感兴趣的朋友,看看idc笔记做的技术笔记!一、要求1 创建数据表CRE
文章正文

这篇文章主要为大家详细介绍了SQL Server table 行转列的sql分析,具有一定的参考价值,可以用来参考一下。

对此感兴趣的朋友,看看idc笔记做的技术笔记!

一、要求1 创建数据表CREATE TABLE [dbo].[StuScore]([stuid] [int] NOT NULL,[subject] [nvarchar](30) NULL,[score] [decimal](5, 1) NULL)2 插入测试数据stuid subject score3 chinese 76.03 math 73.04 chinese 82.05 chinese 66.05 math 93.06 chinese 67.07 math 83.08 chinese 77.08 math 84.03 行转列后的结果stuid chinese math3 76.0 73.04 82.0 0.05 66.0 93.06 67.0 0.07 0.0 83.08 77.0 84.0二 、分析 1 行转列,一个重点就是怎么样知道有多少列,怎么样创建这些列?我们可以先把这个问题搁置,而假设这些列是已知的。 例如示例数据中,可以先假设subject的数据[chinese,math]是已知的,这样问题就简化了许多2 当已知了chinese,math后,我们至少要先得到转换后的tabel结构如下;select stuid, 0 as chinese, 0 as math from dbo.StuScore结果如下stuid chinese math3 0 03 0 04 0 05 0 05 0 06 0 07 0 08 0 08 0 03 接着就需要往这个数据集中去填充chinese, math的数据select stuid,case subject when 'chinese' then score else 0 end as chinese,case subject when 'math' then score else 0 end as mathfrom dbo.StuScore结果如下:stuid chinese math3 76.0 0.03 0.0 73.04 82.0 0.05 66.0 0.05 0.0 93.06 67.0 0.07 0.0 83.08 77.0 0.08 0.0 84.04 细心的读者会发现步骤3中的结果与我们想要的已经非常接近了,只需再做一个sum()处理,就OK了select stuid,sum(case subject when 'chinese' then score else 0 end ) as chinese,sum(case subject when 'math' then score else 0 end ) as mathfrom dbo.StuScore group by stuid得到的正是我们想要的结果stuid chinese math3 76.0 73.04 82.0 0.05 66.0 93.06 67.0 0.07 0.0 83.08 77.0 84.0是不是现在就已经完成了呢?答案是否定的。前面我们已经说过,是为了简化问题,在假设已经知道了subject数据的情况下,这么处理的,实际上subject的数据是可变的,未知的,接下来就是要解决这个问题了5 要获取subject的数据其实很简单select distinct subject from dbo.StuScore获取以后怎样得到case subject when 'chinese' then score else 0 end 这种语句?可以根据subject的值去动态的组sql语句看下面的一段代码declare @sql varchar(2000)set @sql=''select @sql =@sql+ ',case subject when '''+subject+''' then 1 else 0 end as ' + subjectfrom (select distinct subject from dbo.StuScore) as subprint @sqlmessage打印的信息如下:,case subject when 'chinese' then 1 else 0 end as chinese,case subject when 'math' then 1 else 0 end as math6 最后我们就需要将前面步骤综合起来,得到最终的sqldeclare @sql varchar(2000)set @sql='select stuid'select @sql =@sql+ ',sum(case subject when '''+subject+''' then score else 0 end) as ' + subjectfrom (select distinct subject from dbo.StuScore) as subset @sql=@sql + ' from dbo.StuScore group by stuid'exec(@sql)stuid chinese math3 76.0 73.04 82.0 0.05 66.0 93.06 67.0 0.07 0.0 83.08 77.0 84.0至此,整个分析过程和结果就都出来了。初试写文章, 多包涵,指正。

注:关于SQL Server table 行转列的sql分析的内容就先介绍到这里,更多相关文章的可以留意

代码注释

作者:喵哥笔记

IDC笔记

学的不仅是技术,更是梦想!