gpt4 book ai didi

table 行转列的sql详解

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 30 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章table 行转列的sql详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

1、要求 。

1 创建数据表 。

CREATE TABLE [dbo].[StuScore]( 。

[stuid] [int] NOT NULL.

[subject] [nvarchar](30) NULL.

[score] [decimal](5, 1) NULL 。

) 。

2 插入测试数据 。

stuid subject score 。

3 chinese 76.0 。

3 math 73.0 。

4 chinese 82.0 。

5 chinese 66.0 。

5 math 93.0 。

6 chinese 67.0 。

7 math 83.0 。

8 chinese 77.0 。

8 math 84.0 。

3 行转列后的结果 。

stuid chinese math 。

3 76.0 73.0 。

4 82.0 0.0 。

5 66.0 93.0 。

6 67.0 0.0 。

7 0.0 83.0 。

8 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 math 。

3 0 0 。

3 0 0 。

4 0 0 。

5 0 0 。

5 0 0 。

6 0 0 。

7 0 0 。

8 0 0 。

8 0 0 。

3 接着就需要往这个数据集中去填充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 math 。

from dbo.StuScore 。

结果如下:

stuid chinese math 。

3 76.0 0.0 。

3 0.0 73.0 。

4 82.0 0.0 。

5 66.0 0.0 。

5 0.0 93.0 。

6 67.0 0.0 。

7 0.0 83.0 。

8 77.0 0.0 。

8 0.0 84.0 。

4 细心的读者会发现步骤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 math 。

from dbo.StuScore group by stuid 。

得到的正是我们想要的结果 。

stuid chinese math 。

3 76.0 73.0 。

4 82.0 0.0 。

5 66.0 93.0 。

6 67.0 0.0 。

7 0.0 83.0 。

8 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 ' + subject 。

from (select distinct subject from dbo.StuScore) as sub 。

print @sql 。

message打印的信息如下:

,case subject when 'chinese' then 1 else 0 end as chinese,case subject when 'math' then 1 else 0 end as math 。

6 最后我们就需要将前面步骤综合起来,得到最终的sql 。

declare @sql varchar(2000) 。

set @sql='select stuid' 。

select @sql =@sql+ ',sum(case subject when '''+subject+''' then score else 0 end) as ' + subject 。

from (select distinct subject from dbo.StuScore) as sub 。

set @sql=@sql + ' from dbo.StuScore group by stuid' 。

exec(@sql) 。

stuid chinese math 。

3 76.0 73.0 。

4 82.0 0.0 。

5 66.0 93.0 。

6 67.0 0.0 。

7 0.0 83.0 。

8 77.0 84.0 。

至此,整个分析过程和结果就都出来了.

初试写文章, 多包涵,指正.

最后此篇关于table 行转列的sql详解的文章就讲到这里了,如果你想了解更多关于table 行转列的sql详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com