/*
CREATE TABLE tb
(
学生 varchar(10),
月份 varchar(6),
语文 decimal(18,2),
数学 decimal(18,2),
化学 decimal(18,2),
地理 decimal(18,2),
历史 decimal(18,2)
)
insert into tb
select '张三','200601',80,81,82,83,84 union all
select '张三','200602',81,82,82,63,74 union all
select '李四','200601',84,84,82,53,64 union all
select '李四','200602',83,82,85,53,94 union all
select '王二','200601',86,87,86,73,94 union all
select '王二','200602',84,84,82,90,74 union all
select '刘五','200601',70,87,82,87,94
*/
select @s1=isnull(@s1+',','')+quotename(学生)+'=max(case 学生 when '''+学生+''' then 语文 else 0 end)'
from tb group by 学生
set @s1=' select 月份,类型=''语文'','+@s1+' from tb group by 月份'
select @s2=isnull(@s2+',','')+quotename(学生)+'=max(case 学生 when '''+学生+''' then 数学 else 0 end)'
from tb group by 学生
set @s2=' union all select 月份,类型=''数学'','+@s2+' from tb group by 月份 '
select @s3=isnull(@s3+',','')+quotename(学生)+'=max(case 学生 when '''+学生+''' then 化学 else 0 end)'
from tb group by 学生
set @s3=' union all select 月份,类型=''化学'','+@s3+' from tb group by 月份'
select @s4=isnull(@s4+',','')+quotename(学生)+'=max(case 学生 when '''+学生+''' then 地理 else 0 end)'
from tb group by 学生
set @s4=' union all select 月份,类型=''地理'','+@s4+' from tb group by 月份 '
select @s5=isnull(@s5+',','')+quotename(学生)+'=max(case 学生 when '''+学生+''' then 历史 else 0 end)'
from tb group by 学生
set @s5=' union all select 月份,类型=''历史'','+@s5+' from tb group by 月份 order by 类型 asc,月份 asc'--改一下排序
/*
CREATE TABLE tb
(
学生 varchar(10),
月份 varchar(6),
语文 decimal(18,2),
数学 decimal(18,2),
化学 decimal(18,2),
地理 decimal(18,2),
历史 decimal(18,2)
)
insert into tb
select '张三','200601',80,81,82,83,84 union all
select '张三','200602',81,82,82,63,74 union all
select '李四','200601',84,84,82,53,64 union all
select '李四','200602',83,82,85,53,94 union all
select '王二','200601',86,87,86,73,94 union all
select '王二','200602',84,84,82,90,74 union all
select '刘五','200601',70,87,82,87,94
*/
select @s1=isnull(@s1+',','')+quotename(学生)+'=max(case 学生 when '''+学生+''' then 语文 else 0 end)'
from tb group by 学生
set @s1=' select 月份,类型=''语文'','+@s1+' from tb group by 月份'
select @s2=isnull(@s2+',','')+quotename(学生)+'=max(case 学生 when '''+学生+''' then 数学 else 0 end)'
from tb group by 学生
set @s2=' union all select 月份,类型=''数学'','+@s2+' from tb group by 月份 '
select @s3=isnull(@s3+',','')+quotename(学生)+'=max(case 学生 when '''+学生+''' then 化学 else 0 end)'
from tb group by 学生
set @s3=' union all select 月份,类型=''化学'','+@s3+' from tb group by 月份'
select @s4=isnull(@s4+',','')+quotename(学生)+'=max(case 学生 when '''+学生+''' then 地理 else 0 end)'
from tb group by 学生
set @s4=' union all select 月份,类型=''地理'','+@s4+' from tb group by 月份 '
select @s5=isnull(@s5+',','')+quotename(学生)+'=max(case 学生 when '''+学生+''' then 历史 else 0 end)'
from tb group by 学生
set @s5=' union all select 月份,类型=''历史'','+@s5+' from tb group by 月份 order by 类型 desc,月份 asc'
有兴趣的人可以用我的这个SQL语气去生成表数据,然后用上述的方法看能不能实现以下的效果!
CREATE TABLE tb
(
学生 varchar(10),
月份 varchar(6),
语文 decimal(18,2),
数学 decimal(18,2),
化学 decimal(18,2),
地理 decimal(18,2),
历史 decimal(18,2)
)
insert into tb
select '张三','200601',80,81,82,83,84 union all
select '张三','200602',81,82,82,63,74 union all
select '李四','200601',84,84,82,53,64 union all
select '李四','200602',83,82,85,53,94 union all
select '王二','200601',86,87,86,73,94 union all
select '王二','200602',84,84,82,90,74 union all
select '刘五','200601',70,87,82,87,94
select @s=isnull(@s+',','')+quotename(学生)+'=max(case 学生 when '''+学生+''' then 月份 else 0 end)'
from ta group by 学生
set @s='select 类型=''月份'','+@s+',月份 from ta group by 月份'
select @s2=isnull(@s2+',','')+quotename(学生)+'=max(case 学生 when '''+学生+''' then 语文 else 0 end)'
from ta group by 学生
set @s2=' union all select 类型=''语文'','+@s2+',月份 from ta group by 月份'
select @s3=isnull(@s3+',','')+quotename(学生)+'=max(case 学生 when '''+学生+''' then 数学 else 0 end)'
from ta group by 学生
set @s3=' union all select 类型=''数学'','+@s3+',月份 from ta group by 月份 order by 月份 asc,类型 desc'
create table #t
(
Name varchar(10) ,
Subject varchar(10) ,
Result int
)
insert into #t(Name , Subject , Result) values('张三','语文','73')
insert into #t(Name , Subject , Result) values('张三','数学','83')
insert into #t(Name , Subject , Result) values('张三','物理','93')
insert into #t(Name , Subject , Result) values('李四','语文','74')
insert into #t(Name , Subject , Result) values('李四','数学','83')
insert into #t(Name , Subject , Result) values('李四','物理','93')
declare @sql varchar(8000)
set @sql = 'select Name as ' + '姓名'
select @sql = @sql + ' , sum(case Subject when ''' + Subject + ''' then Result end) [' + Subject + ']'
from (select distinct Subject from #t) as a
set @sql = @sql + ' from #t group by name'
exec(@sql)
create table #t
(
姓名 varchar(10) ,
语文 int ,
数学 int ,
物理 int
)
insert into #t(姓名 , 语文 , 数学 , 物理) values('张三',73,83,93)
insert into #t(姓名 , 语文 , 数学 , 物理) values('李四',74,84,94)
select 姓名 as Name,'语文' as Subject,语文 as Result from #t union
select 姓名 as Name,'数学' as Subject,数学 as Result from #t union
select 姓名 as Name,'物理' as Subject,物理 as Result from #t
order by 姓名 desc
自己写出来了!
共享一下
大家看看有没有错!
declare @sql varchar(8000) ,@sql1 varchar(8000)
set @sql = 'select 月份,科目,'
select @sql=@sql+'sum(' + 学生+') as '''+ 学生+ ''' ,' from (select distinct 学生 from tb )a
set @sql=left(@sql,len(@sql)-1) + ' from ('
--语文
set @sql1='select distinct 月份,''语文'' as ''科目'','
select @sql1=@sql1+'case 学生 when '''+ 学生 + ''' then (select 语文 from tb where 学生=a.学生 and 月份=a.月份) else 0 end '''+ 学生+''','
from (select distinct 学生 from tb) a
set @sql1=left(@sql1,len(@sql1)-1) + ' from tb a union all '
--数学
set @sql1=@sql1+' select distinct 月份,''数学'' as ''科目'','
select @sql1=@sql1+'case 学生 when '''+ 学生 + ''' then (select 数学 from tb where 学生=a.学生 and 月份=a.月份) else 0 end '''+ 学生+''','
from (select distinct 学生 from tb) a
set @sql1=left(@sql1,len(@sql1)-1) + ' from tb a union all '
--化学
set @sql1=@sql1+' select distinct 月份,''化学'' as ''科目'','
select @sql1=@sql1+'case 学生 when '''+ 学生 + ''' then (select 化学 from tb where 学生=a.学生 and 月份=a.月份) else 0 end '''+ 学生+''','
from (select distinct 学生 from tb) a
set @sql1=left(@sql1,len(@sql1)-1) + ' from tb a union all '
--地理
set @sql1=@sql1+' select distinct 月份,''地理'' as ''科目'','
select @sql1=@sql1+'case 学生 when '''+ 学生 + ''' then (select 地理 from tb where 学生=a.学生 and 月份=a.月份) else 0 end '''+ 学生+''','
from (select distinct 学生 from tb) a
set @sql1=left(@sql1,len(@sql1)-1) + ' from tb a union all '
--历史
set @sql1=@sql1+' select distinct 月份,''历史'' as ''科目'','
select @sql1=@sql1+'case 学生 when '''+ 学生 + ''' then (select 历史 from tb where 学生=a.学生 and 月份=a.月份) else 0 end '''+ 学生+''','
from (select distinct 学生 from tb) a
set @sql1=left(@sql1,len(@sql1)-1) + ' from tb a '
set @sql=@sql+ @sql1 + ') aa group by 月份,科目
order by 科目 ,月份'
--print @sql1
exec (@sql)