`
guohf
  • 浏览: 407672 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

行列转换

阅读更多

数据库行列转换

 

SQLserver 2000 行列转换例子:
1.
学号,  课程号, 分数
sid     cid    mark
030611 1000 70
030611 1001 80
030611 1002 75
030611 1003 86
030611 1004 70
030612 1000 74
030612 1001 83
030612 1002 75
030612 1003 86
030612 1004 75
030613 1000 75
030613 1001 85
030613 1002 85
030613 1003 86
030613 1004 90
=>转换为下面形式:
sid     1000  1001    1002    1003     1004    总分   平均分  最高分
030611 70 80 75 86 70 381 76 86
030612 74 83 75 86 75 393 78 86
030613 75 85 85 86 90 421 84 90
方法一:
select sid ,
[1000]=sum(case cid when '1000'then mark else null end),
[1001]=sum(case cid when '1001'then mark else null end),
[1002]=sum(case cid when '1002'then mark else null end),
[1003]=sum(case cid when '1003'then mark else null end),
[1004]=sum(case cid when '1004'then mark else null end),
[总分]=sum(case sid when sid then mark else null end),
[平均分]=avg(case sid when sid then mark else null end),
[最高分]=max(case sid when sid then mark else null end)
from sc group by sid;

方法二:
  --1)声明一个字符串变量,以供动态拼装
  declare @sql varchar(8000)
  --2)拼装sql语句
  set @sql = 'select sid'
  --3)动态获得cid,为每个cid构建一个列 --把所有唯一的科目的名称都列举出来
  select @sql=@sql+',['+cid+']=sum(case cid when '''+cid+''' then mark else null end)'from (select distinct cid from sc) as sc1
  select @sql=@sql+',[总分]=sum(case sid when sid then mark else null end)'
  select @sql=@sql+',[平均分]=avg(case sid when sid then mark else null end)'
  select @sql=@sql+',[最高分]=max(case sid when sid then mark else null end)'
  select @sql=@sql+'from sc group by sid'--分组
  exec (@sql) --执行sql命令

ps:
CASE input_expression WHEN when_expression THEN result_expression
        [ ...n ]
    [
        ELSE else_result_expression
    END
input_expression:是使用简单 CASE 格式时所计算的表达式。
when_expression:使用简单 CASE 格式时 input_expression 所比较的简单表达式。
result_expression:当 input_expression = when_expression 取值为 TRUE,即得到result_expression的值
else_result_expression:当比较运算取值不为 TRUE 时返回的表达式的值,省略else_result_expression时,
前面判断的结果不为TRUE时,默认为NULL

oracle 10g行列转换的例子:

NAME       COURSE                    GRADE
---------- -------------------- ----------
张松       语文                         74
张松       数学                         83
张松       物理                         93
李四       语文                         74
李四       数学                         84
李四       物理                         94

方法一:
 select name,
  sum(decode(course , '语文' ,grade ,0))"语文",
  sum(decode(course , '数学', grade , null))"数学",
  sum(decode(course , '物理' , grade , null))"物理",
  max(decode(name,name,grade,null))"最高分",
  sum(decode(name,name,grade,null))"总分",
  avg(decode(name,name,grade,null))"平均分"
  from tb group by name;

NAME             语文       数学       物理     最高分       总分     平均分
---------- ---------- ---------- ---------- ---------- ---------- ----------
李四               74         84         94         94        252         84
张松               74         83         93         93        250 83.3333333

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics