如何用sql语句实现纵表到横表的转换 (100分)

  • 主题发起人 主题发起人 webug
  • 开始时间 开始时间
W

webug

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在有一个纵的成绩表cj(学号,科目,成绩),我现在想把cj转换成横的排列cj1并计算总分
请问有没什么好的办法:
如学号1001在cj表中有3条记录(1001 sx 90;1001 yw 70;1001 yy 80)现要转换成:
表结构为(学号,数学,语文,英语,总分)即:(1001 90 70 80 240)
(注我用的是access数据库,另问交叉表函数如何使用)
 
select xh,sx=sum(case when sx then fs else 0 end),
yw=sum(case when yw then fs else 0 end),
yy=sum(case when yy then fs else 0 end),
sx+yw+yy
from tablename
group by xh
 
请使用以下SQL语句:
select 学号,decode(科目,'sx',成绩,0) 数学,
decode(科目,'yw',成绩,0) 语文,
decode(科目,'yy',成绩,0) 英语,
sum(成绩) 总分
from 成绩表
where 学号=1001
group by 学号
 
应该 case 科目 when sx
case 科目 when yw
 
什么后台数据库?
 
access 数据库不能用case 语句
select xh,sx=sum(iif(科目='sx',cj,0)),
yw=sum(iif(科目='yw',cj,0)),
yy=sum(iif(科目='yy',cj,0)),
sum(cj)
from tablename
group by xh
 
如果是access数据库,那么恭喜你,它自带有个交叉表函数。
如果是sqlserver那么就用ugvanxk的方法。
 
我也想借机问一下,
如果科目是动态的呢?
也就是说不一定是多少科
 
我曾经实现过该问题,如科目数不定,则在前台程序中动态组sql,
如有n个科目,则会组n个子查询,在用一个主查询调用
如:
select t1.xh, t1.yw, t2.sx,t3.yy
from
(select xh, yw from cj) t1,
(select xh, sx from cj) t2,
(select xh, yy from cj) t3
where t1.xh = t2.xh
and t1.xh = t3.xh

只要前台动态组出sql, 即可


 
顺便多说一句,如科目数不定,先“select distinct km from cj”选出科目数,
然后循环组n个子查询
该程序较复杂
 
请教一下
acess 用交叉表函数应怎么写上面的结果。
我看了半天不会用那个函数
 
表table1

学科 分数
语文 11
数学 12
英语 13
物理 8
化学 9

TRANSFORM SUM(分数)
SELECT "分数" AS 学科 FROM TABLE1 GROUP BY "分数"
PIVOT 学科

得到

学科 化学 数学 物理 英语 语文
分数 9 12 8 13 11
 
后退
顶部