|
/* 大概是这样子的:
有三个数据库表,
一个是学生表S(SNO,SNAME),字段分别表示学号,姓名;
一个是课程表C(CNO,CNAME),字段分别表示课程号,课程名称;
一个是成绩表T(SNO,CNO,SCORE),字段分别表示学号,课程号,该学生该课程成绩。
现在要实现这个表:
姓名 语文 数学 英语 物理 化学 ...
张三 分数 分数 分数 分数 分数
李四 分数 分数 分数 分数 分数
王五 分数 分数 分数 分数 分数
...
不知道有多少个课程*/
建表
if object_id('s') is not null
drop table s
if object_id('c') is not null
drop table c
if object_id('t') is not null
drop table t
create table S(sno int,sname varchar(300))
create table c(cno int,cname varchar(300))
create table t(sno int,cno int,score int)
insert into S(sno,sname)
select 1,'张三'
union
select 2,'李四'
union
select 3,'王五'
union
select 4,'甲六'
insert into c(cno,cname)
select 1,'语文'
union
select 2,'数学'
union
select 3,'英语'
union
select 4,'物理'
union
select 5,'化学'
union
select 6,'历史'
union
select 7,'历史'
insert into t(SNO,CNO,score)
select 1,1,80
union
select 1,2,70
union
select 1,3,50
union
select 1,4,60
union
select 1,5,90
union
select 1,6,60
union
select 2,1,41
union
select 2,2,42
union
select 2,3,53
union
select 2,4,64
union
select 3,1,43
union
select 3,2,44
union
select 3,3,55
union
select 3,4,66
/* 下面是用动态SQL语句的情况*/
select * from s
select * from c
select * from t
declare @abc varchar(3000)
set @abc = ''
/*取最高分用max(),最低分用min(),平均用avg()*/
select @abc = @abc + ',avg( case when cno = '+ cast(cno as varchar(8)) +' then score end ) as '''+cname+ '''' from c
declare @sql varchar(3000)
set @sql = 'select (select sname from S where S.sno= T.sno ) as sname '+@abc +' from T group by sno'
exec (@sql)
/* 下面是不用动态SQL语句的情况*/
select sname 姓名,
max(yw) 语文,
max(sx) 数学,
max(yy) 英语,
max(wl) 物理,
max(hx) 化学,
max(ls) 历史
from (
select sname ,(case when cname='语文' then score end) yw,
(case when cname='数学' then score end) sx,
(case when cname='英语' then score end) yy,
(case when cname='物理' then score end) wl,
(case when cname='化学' then score end) hx,
(case when cname='历史' then score end) ls
from t left join s on t.sno=s.sno left join c on t.cno=c.cno
) tmp
group by sname
/* 不用动态SQL语句的情况*/
if object_id('stat') is not null
drop table stat
create table stat(class varchar(30), fruit varchar(30), amount int)
insert into stat (class,fruit,amount)
select 'class a', 'apple', 30
union
select 'class a', 'pear', 15
union
select 'class b', 'apple', 40
union
select 'class b', 'pear', 20
union
select 'class a','apple',11
union
select 'class b','apple',12
select * from stat
select class, sum(apple_amount) apple_amount, sum(pear_amount) pear_amount
from (
select class, (case when fruit='apple' then amount else 0 end) as apple_amount, (case when fruit='pear' then amount else 0 end) as pear_amount
from stat
) tmp
group by class
select * from stat
select class, sum(apple_amount) apple_amount, sum(pear_amount) pear_amount
from (
select class, (case when fruit='apple' then amount else 0 end) as apple_amount, (case when fruit='pear' then amount else 0 end) as pear_amount
from stat
) tmp
group by class |
|