日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sql server 交叉表查询实例-成绩统计

發布時間:2025/4/14 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

這就是交叉表的用法,對于報表統計很有用處,我們可以依此類推寫出功能更強大的查詢。



轉載于:https://www.cnblogs.com/mingdep/archive/2011/12/22/2297560.html

總結

以上是生活随笔為你收集整理的sql server 交叉表查询实例-成绩统计的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。