首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

学生成绩按次数分组求合,该怎么处理

2012-01-26 
学生成绩按次数分组求合 原数据表结构如下回数语文数学英语政治1607673622679078763998081324945067725803

学生成绩按次数分组求合

原数据表结构如下
回数语文数学英语政治
160767362
267907876
399808132
494506772
580359782
683837492
782897632
....
....
....
最多是八回


变选出记录的结果是
第一回第二回第三回第四回.....最多是八回平均值
语文6067999480........(1-8回语文的平均值
数学......
英语......
政治......

帮帮我!

谢谢了,
虽说是用程序组合出来了,
但还是希望写成SQL文出来!!

[解决办法]
还是行转列问题,查查,代码多了
[解决办法]
最多8回? 如果是定死的話,也可以不用動態語句,寫死就OK
[解决办法]
不是一般的行转列

他这个应该叫列转行
写起来很别扭
[解决办法]
1、既然最多只有8回的话,你就固定好了,列用case when 语句进行组合。
2、列的话,用多个union all 进行组合,就是说第一次我只查询语文的,union all 查询数学的,

这样可以达到你的效果吧

[解决办法]
select ex1, sum(回1) as 回1,sum(回2)as 回2
from(
select '语文 ' as ex1, case when 回数=1 then 语文 else 0 end as 回1,
, case when 回数=2 then 语文 else 0 end as 回2
from table1
union all
select '数学 ' as ex1, case when 回数=1 then 数学 else 0 end as 回1,
, case when 回数=2 then 数学 else 0 end as 回2
from table1
)
group by ex1
[解决办法]
--建表
create table test
(
回数 int,
语文 int,
数学 int,
英语 int,
政治 int
)

insert into test select 1,60,76,73,62
insert into test select 2,67,90,78,76
insert into test select 3,99,80,81,32
insert into test select 4,94,50,67,72
insert into test select 5,80,35,97,82
insert into test select 6,83,83,74,92
insert into test select 7,82,89,76,32

--语句
select '语文 ' as [科目],sum(case 回数 when 1 then 语文 end) as 第一回,
sum(case 回数 when 2 then 语文 end) as 第二回,
sum(case 回数 when 3 then 语文 end) as 第三回,
sum(case 回数 when 4 then 语文 end) as 第四回,
sum(case 回数 when 5 then 语文 end) as 第五回,
sum(case 回数 when 6 then 语文 end) as 第六回,
sum(case 回数 when 7 then 语文 end) as 第七回,
sum(case 回数 when 8 then 语文 end) as 第八回,
sum(语文)/count(1) as 平均数
from test
union all
select '数学 ' as [科目],sum(case 回数 when 1 then 数学 end) as 第一回,
sum(case 回数 when 2 then 数学 end) as 第二回,
sum(case 回数 when 3 then 数学 end) as 第三回,
sum(case 回数 when 4 then 数学 end) as 第四回,
sum(case 回数 when 5 then 数学 end) as 第五回,
sum(case 回数 when 6 then 数学 end) as 第六回,
sum(case 回数 when 7 then 数学 end) as 第七回,
sum(case 回数 when 8 then 数学 end) as 第八回,
sum(数学)/count(1) as 平均数
from test
union all
select '英语 ' as [科目],sum(case 回数 when 1 then 英语 end) as 第一回,
sum(case 回数 when 2 then 英语 end) as 第二回,
sum(case 回数 when 3 then 英语 end) as 第三回,
sum(case 回数 when 4 then 英语 end) as 第四回,
sum(case 回数 when 5 then 英语 end) as 第五回,
sum(case 回数 when 6 then 英语 end) as 第六回,
sum(case 回数 when 7 then 英语 end) as 第七回,


sum(case 回数 when 8 then 英语 end) as 第八回,
sum(英语)/count(1) as 平均数
from test
union all
select '政治 ' as [科目],sum(case 回数 when 1 then 政治 end) as 第一回,
sum(case 回数 when 2 then 政治 end) as 第二回,
sum(case 回数 when 3 then 政治 end) as 第三回,
sum(case 回数 when 4 then 政治 end) as 第四回,
sum(case 回数 when 5 then 政治 end) as 第五回,
sum(case 回数 when 6 then 政治 end) as 第六回,
sum(case 回数 when 7 then 政治 end) as 第七回,
sum(case 回数 when 8 then 政治 end) as 第八回,
sum(政治)/count(1) as 平均数
from test

--结果
科目第一回第二回第三回第四回第五回第六回第七回第八回平均数
语文60679994808382NULL80
数学76908050358389NULL71
英语73788167977476NULL78
政治62763272829232NULL64

(所影响的行数为 4 行)

--谁有更好的写法?
[解决办法]
create table T (id int,chinese int,math int,english int,publication int)
insert into T
select 1,60,76,73,62 union all
select 2,67,90,87,67 union all
select 3,89,86,68,72

declare @sql1 varchar(8000)
set @sql1= ' '
select @sql1=@sql1+ ',sum(case when id= '+convert(char(1),id)+ ' then chinese end) as [第 '+convert(char(1),id)+ '回] '
from T
select @sql1=@sql1+ ',[平均分]=convert(numeric(9,2),avg(1.0*chinese)) '
select @sql1= 'select [課目]= ' 'chinese ' ' '+@sql1+ ' from T '

declare @sql2 varchar(8000)
set @sql2= ' '
select @sql2=@sql2+ ',sum(case when id= '+convert(char(1),id)+ ' then math end) as [第 '+convert(char(1),id)+ '回] '
from T
select @sql2=@sql2+ ',[平均分]=convert(numeric(9,2),avg(1.0*math)) '
select @sql2= ' union all select [課目]= ' 'math ' ' '+@sql2+ ' from T '

declare @sql3 varchar(8000)
set @sql3= ' '
select @sql3=@sql3+ ',sum(case when id= '+convert(char(1),id)+ ' then english end) as [第 '+convert(char(1),id)+ '回] '
from T
select @sql3=@sql3+ ',[平均分]=convert(numeric(9,2),avg(1.0*english)) '
select @sql3= ' union all select [課目]= ' 'english ' ' '+@sql3+ ' from T '

declare @sql4 varchar(8000)
set @sql4= ' '
select @sql4=@sql4+ ',sum(case when id= '+convert(char(1),id)+ ' then publication end) as [第 '+convert(char(1),id)+ '回] '
from T
select @sql4=@sql4+ ',[平均分]=convert(numeric(9,2),avg(1.0*publication)) '
select @sql4= ' union all select [課目]= ' 'publication ' ' '+@sql4+ ' from T '

exec(@sql1+@sql2+@sql3+@sql4)

drop table T
/*
課目 第1回 第2回 第3回 平均分
----------- ----------- ----------- ----------- -----------
chinese 60 67 89 72.00
math 76 90 86 84.00
english 73 87 68 76.00
publication 62 67 72 67.00
*/
[解决办法]
--创建测试环境
create table t(回数 int,语文 int,数学 int,英语 int,政治 int)

--插入测试数据
insert t(回数,语文,数学,英语,政治)
select '1 ', '60 ', '76 ', '73 ', '62 ' union all
select '2 ', '67 ', '90 ', '78 ', '76 ' union all
select '3 ', '99 ', '80 ', '81 ', '32 ' union all


select '4 ', '94 ', '50 ', '67 ', '72 ' union all
select '5 ', '80 ', '35 ', '97 ', '82 ' union all
select '6 ', '83 ', '83 ', '74 ', '92 ' union all
select '7 ', '82 ', '89 ', '76 ', '32 '

--求解过程
select 科目
,sum(case when 回数 = 1 then 分数 else 0 end) as 回数1
,sum(case when 回数 = 2 then 分数 else 0 end) as 回数2
,sum(case when 回数 = 3 then 分数 else 0 end) as 回数3
,sum(case when 回数 = 4 then 分数 else 0 end) as 回数4
,sum(case when 回数 = 5 then 分数 else 0 end) as 回数5
,sum(case when 回数 = 6 then 分数 else 0 end) as 回数6
,sum(case when 回数 = 7 then 分数 else 0 end) as 回数7
,sum(case when 回数 = 8 then 分数 else 0 end) as 回数8
from (
select 回数,语文 as 分数, '语文 ' as 科目 from t union all
select 回数,数学, '数学 ' from t union all
select 回数,英语, '英语 ' from t union all
select 回数,政治, '政治 ' from t
) _x
group by 科目

--删除测试环境
drop table t

/*--测试结果
科目 回数1 回数2 回数3 回数4 回数5 回数6 回数7 回数8
---- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
数学 76 90 80 50 35 83 89 0
英语 73 78 81 67 97 74 76 0
语文 60 67 99 94 80 83 82 0
政治 62 76 32 72 82 92 32 0

(所影响的行数为 4 行)

*/

[解决办法]
--创建测试环境
create table t(回数 int,语文 int,数学 int,英语 int,政治 int)

--插入测试数据
insert t(回数,语文,数学,英语,政治)
select '1 ', '60 ', '76 ', '73 ', '62 ' union all
select '2 ', '67 ', '90 ', '78 ', '76 ' union all
select '3 ', '99 ', '80 ', '81 ', '32 ' union all
select '4 ', '94 ', '50 ', '67 ', '72 ' union all
select '5 ', '80 ', '35 ', '97 ', '82 ' union all
select '6 ', '83 ', '83 ', '74 ', '92 ' union all
select '7 ', '82 ', '89 ', '76 ', '32 '

--求解过程
select 科目
,sum(case when 回数 = 1 then 分数 else 0 end) as 回数1
,sum(case when 回数 = 2 then 分数 else 0 end) as 回数2
,sum(case when 回数 = 3 then 分数 else 0 end) as 回数3
,sum(case when 回数 = 4 then 分数 else 0 end) as 回数4
,sum(case when 回数 = 5 then 分数 else 0 end) as 回数5
,sum(case when 回数 = 6 then 分数 else 0 end) as 回数6
,sum(case when 回数 = 7 then 分数 else 0 end) as 回数7
,sum(case when 回数 = 8 then 分数 else 0 end) as 回数8
,avg(分数) as 平均分
from (
select 回数,语文 as 分数, '语文 ' as 科目 from t union all
select 回数,数学, '数学 ' from t union all
select 回数,英语, '英语 ' from t union all
select 回数,政治, '政治 ' from t
) _x
group by 科目

--删除测试环境
drop table t

/*--测试结果
科目 回数1 回数2 回数3 回数4 回数5 回数6 回数7 回数8 平均分
---- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
数学 76 90 80 50 35 83 89 0 71
英语 73 78 81 67 97 74 76 0 78


语文 60 67 99 94 80 83 82 0 80
政治 62 76 32 72 82 92 32 0 64

(所影响的行数为 4 行)

*/

[解决办法]
恩,楼上的简单

热点排行