SQL数据库中表行列转换显示

SQL数据库中表行列转换显示,第1张

只有新创建一张表。CREATE TABLE t_row_col AS

SELECT id, 'c1' cn, c1 cv

FROM t_col_row

UNION ALL

SELECT id, 'c2' cn, c2 cv

FROM t_col_row

UNION ALL

SELECT id, 'c3' cn, c3 cv FROM t_col_row;

SELECT FROM t_row_col ORDER BY 1,2;

/学生表:Member

字段名称 数据类型 说明

MID Char(10) 学生号,主键

MName Char(50) 姓名

课程表Class:

字段名称 数据类型 说明

FID Char(10) 课程,主键

FName Char(50) 课程名

成绩表:Score

字段名称 数据类型 说明

SID int 自动编号,主键,成绩记录号

FID Char(10) 课程号,外键

MID Char(10) 学生号,外键

Score int 成绩/

create table member(mid varchar(10) primary key,mname varchar(50))

create table class(fid varchar(10) primary key,fname varchar(50))

create table score(sid int primary key,fid varchar(10),mid varchar(10),score int)

go

insert into member values ('1001','张三')

insert into member values ('1002','李四')

insert into class values ('A1','数学')

insert into class values ('A2','化学')

insert into class values ('A3','政治')

insert into class values ('A4','历史')

insert into class values ('A5','语文')

insert into class values ('A6','物理')

insert into score values (1,'A1','1001',80)

insert into score values (2,'A1','1002',85)

insert into score values (3,'A2','1001',84)

insert into score values (4,'A4','1002',90)

go

declare @sql varchar(8000)

select @sql='select amname as 学生姓名'

select @sql=@sql+',sum(case cfname when '''+fname+''' then bscore else null end )as '+fname from class

select @sql=@sql+' from member a left join score b on amid=bmid left join class c on bfid=cfid group by amname'

print @sql

exec (@sql)

看看这个吧,以前我给他们写的

由于拆分后还需要按顺序组合成,所以使用游标。

declare @a varchar(1000), @b varchar(1000)

declare @seq_a int, @seq_b int

set @seq_a = 1

set @seq_b = 1

create table #a(seq int, val int)

create table #b(seq int, val int)

declare cur cursor for select A, B from tablename

open cur

fetch next from cur into @a, @b

while @@fetch_status = 0

begin

if charindex(',',@a,1) = 0

begin

insert into #a values(@seq_a, cast(@a as int))

set @seq_a = @seq_a + 1

end

else

begin

declare @index_a int,@pos_a int

set @index_a = 1

set @a = @a + ','

set @pos_a = charindex(',',@a,@index_a)

while @pos_a > 0

begin

insert into #a values(@seq_a, cast(substring(@a,@index_a,@pos_a - @index_a) as int))

set @seq_a = @seq_a + 1

set @index_a = @pos_a + 1

set @pos_a = charindex(',',@a,@index_a)

end

end

if charindex(',',@b,1) = 0

begin

insert into #b values(@seq_b, cast(@b as int))

set @seq_b = @seq_b + 1

end

else

begin

declare @index_b int,@pos_b int

set @index_b = 1

set @b = @b + ','

set @pos_b = charindex(',',@b,@index_b)

while @pos_b > 0

begin

insert into #b values(@seq_b, cast(substring(@b,@index_b,@pos_b - @index_b) as int))

set @seq_b = @seq_b + 1

set @index_b = @pos_b + 1

set @pos_b = charindex(',',@b,@index_b)

end

end

fetch next from cur into @a, @b

end

close cur

deallocate cur

select #aval as A, #bval as B from #a full join #b on #aseq = #bseq

order by isnull(#aseq, #bseq)

drop table #a

drop table #b

oracle和sqlserver都可以这样写:

select PorderID,

TestDate,

max(case when TestID = '1' then TestValue else null end) 厚度,

max(case when TestID = '2' then TestValue else null end) 重量,

max(case when TestID = '3' then TestValue else null end) 拉力强度CD,

max(case when TestID = '4' then TestValue else null end) 拉力强度MD,

max(case when TestID = '5' then TestValue else null end) 剥离强度CD,

max(case when TestID = '6' then TestValue else null end) 剥离强度MD

from 表名

group by PorderID, TestDate

解决请采纳。

这段时间要弄财务报表,遇到了一个动态行转列的问题,数据库用的是mysql的。感觉mysql实现动态行转列比mssql复杂多了。网上的都是处理的一个表(比较简单),而我要处理的数据来自于多个表,对于行转列的行也要进行一定的过滤处理,最后在自己的努力下,总算出来啦,附件是完整代码。这两个存储过程都是带输入参数的,一个对要转的行有处理,一个没有处理,两个例子,都放出来,希望可以给遇到同样问题的朋友一些帮助。

以上就是关于SQL数据库中表行列转换显示全部的内容,包括:SQL数据库中表行列转换显示、SQL题目,行转列, 求高手解答,看清楚表中数据再解答、数据库截取函数和行转列问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10149678.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存