zoukankan      html  css  js  c++  java
  • sql server 交叉表查询实例-成绩统计

    分类 数据库
    时间 12/10/2010 7:06:51 AM
    ------------------------------------------------------------

    首先我们建立如下的表:

    sc(成绩表)
    stuid clsid                                              scroe                                                
    ----- -------- -----------------------------------------------------
    0101  1                                                  75.0
    0102  1                                                  70.0
    0103  1                                                  90.0
    0101  2                                                  89.0
    0102  2                                                  80.0
    0103  2                                                  99.0
    0101  3                                                  89.0
    0102  3                                                  79.0
    0103  3                                                  67.0

    其中stuid表示学生编号,clsid表示课程编号,scroe表示成绩

    stu(学生表)
    stuid       stuname                                           
    ----------- --------------------------------------------------
    101         张三
    102         李四
    103         王五

    cls(课程表)
    clsid       name                                              
    ----------- --------------------------------------------------
    1           语文
    2           数学
    3           英语

    接下来就是关键了,其实也不算好复杂,就是用到了动态sql

    declare @sql nvarchar(4000),@sql1 nvarchar(4000)
    select @sql='',@sql1=''

    select @sql=@sql+',['+name+']=sum(case clsid when '''+clsid+''' then scroe else 0 end)',
           @sql1=@sql1+',['+name+'名次]=(select sum(1) from # where ['+name+']>=a.['+name+'])'      
    from(select distinct b.clsid,c.name from sc as b inner join cls as c on c.clsid=b.clsid) as a order by clsid

    exec('select stuid 学号'+@sql+',总成绩=sum(scroe)
    ,平均分=Convert(dec(5,1),avg(scroe)),总名次=(select sum(1) from(select stuid,aa=sum(scroe) from sc group by stuid) aa where sum(a.scroe)<=aa) into # from sc as a group by stuid select b.stuname as 姓名,a.*'+@sql1+' from # as a inner join stu as b on a.学号=b.stuid')

    以下就是结果:

    姓名    学号    语文    数学    英语    总成绩  平均分 总名次 语文名次 数学名次 英语名次   
    ---------------------------------------------------- --------------------------------------
    张三     0101    75.0    89.0      89.0     253.0      84.3         2             2                2               1
    李四     0102    70.0    80.0      79.0     229.0      76.3         3             3                3               2
    王五     0103    90.0    99.0      67.0     256.0      85.3         1             1                1               3

    这就是交叉表的用法,对于报表统计很有用处,我们可以依此类推写出功能更强大的查询。



  • 相关阅读:
    Linux c字符串中不可打印字符转换成16进制
    jQuery概述,代码举例及最新版下载
    linux/centos下安装nginx(rpm安装和源码安装)详细步骤
    Session id实现通过Cookie来传输方法及代码参考
    申请Android Map 的API Key(v2)的最新申请方式(SHA1密钥)
    Linux内核中影响tcp三次握手的一些协议配置
    基于DIV+ul+li实现的表格(多示例)
    修改Windows硬盘分区名称
    Linux下c基于openssl生成MD5的函数
    Web前端设计:Html强制不换行<nobr>标签用法代码示例
  • 原文地址:https://www.cnblogs.com/mingdep/p/2297560.html
Copyright © 2011-2022 走看看