只有新创建一张表。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题目,行转列, 求高手解答,看清楚表中数据再解答、数据库截取函数和行转列问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)