首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

不同学科同时排班名次和校名次有关问题

2012-03-09 
不同学科同时排班名次和校名次问题原始数据如下:班姓名语文数学总分1张三80811张四81791王五79662钱七6689

不同学科同时排班名次和校名次问题
原始数据如下:

班姓名语文数学总分
1张三8081
1张四8179
1王五7966
2钱七6689
2孙八8977
2周九7753
3吴十5391
3钱二9142
3杨一4274

现在想对各科作如下排序,包括计算总分
班姓名语文班名次校名次数学班名次校名次总分班名次校名次
1张三8081
1张四8179
1王五7966
2钱七6689
2孙八8977
2周九7753
3吴十5391
3钱二9142
3杨一4274

求高手给出SQL语句学习下

[解决办法]

SQL code
declare @T table (班 int,姓名 varchar(4),语文 int,数学 int,总分 sql_variant)insert into @Tselect 1,'张三',80,81,null union allselect 1,'张四',81,79,null union allselect 1,'王五',79,66,null union allselect 2,'钱七',66,89,null union allselect 2,'孙八',89,77,null union allselect 2,'周九',77,53,null union allselect 3,'吴十',53,91,null union allselect 3,'钱二',91,42,null union allselect 3,'杨一',42,74,nullselect 班,姓名,语文,班名次=(select count(1) from @T where 班=t.班 and 语文>=t.语文),校名次=(select count(1) from @T where 语文>=t.语文),数学,班名次=(select count(1) from @T where 班=t.班 and 数学>=t.数学),校名次=(select count(1) from @T where 数学>=t.数学),总分=语文+数学,班名次=(select count(1) from @T where 班=t.班 and 语文+数学>=t.语文+t.数学),校名次=(select count(1) from @T where 语文+数学>=t.语文+t.数学)from @T t/*班           姓名   语文          班名次         校名次         数学          班名次         校名次         总分          班名次         校名次----------- ---- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------1           张三   80          2           4           81          1           3           161         1           21           张四   81          1           3           79          2           4           160         2           31           王五   79          3           5           66          3           7           145         3           52           钱七   66          3           7           89          1           2           155         2           42           孙八   89          1           2           77          2           5           166         1           12           周九   77          2           6           53          3           8           130         3           83           吴十   53          2           8           91          1           1           144         1           63           钱二   91          1           1           42          3           9           133         2           73           杨一   42          3           9           74          2           6           116         3           9*/
[解决办法]
SQL code
create table yxdxcy(班 int, 姓名 char(6), 语文 int, 数学 int, 总分 int)insert into yxdxcy(班,姓名,语文,数学)select 1, '张三', 80, 81 union all select 1, '张四', 81, 79 union all  select 1, '王五', 79, 66 union all  select 2, '钱七', 66, 89 union all  select 2, '孙八', 89, 77 union all  select 2, '周九', 77, 53 union all  select 3, '吴十', 53, 91 union all  select 3, '钱二', 91, 42 union all  select 3, '杨一', 42, 74 select a.班, a.姓名, a.语文, b.rn '班名次', c.rn '校名次',a.数学, d.rn '班名次', e.rn '校名次',a.语文+a.数学 '总分', f.rn '班名次', g.rn '校名次'from yxdxcy ainner join(select 班,姓名,row_number() over(partition by 班 order by 语文 desc) rn from yxdxcy) bon a.班=b.班 and a.姓名=b.姓名inner join(select 班,姓名,row_number() over(order by 语文 desc) rn from yxdxcy) con a.班=c.班 and a.姓名=c.姓名inner join(select 班,姓名,row_number() over(partition by 班 order by 数学 desc) rn from yxdxcy) don a.班=d.班 and a.姓名=d.姓名inner join(select 班,姓名,row_number() over(order by 数学 desc) rn from yxdxcy) eon a.班=e.班 and a.姓名=e.姓名inner join(select 班,姓名,row_number() over(partition by 班 order by 语文+数学 desc) rn from yxdxcy) fon a.班=f.班 and a.姓名=f.姓名inner join(select 班,姓名,row_number() over(order by 语文+数学 desc) rn from yxdxcy) gon a.班=g.班 and a.姓名=g.姓名班           姓名     语文          班名次                  校名次                  数学          班名次                  校名次                  总分          班名次                  校名次----------- ------ ----------- -------------------- -------------------- ----------- -------------------- -------------------- ----------- -------------------- --------------------1           张四     81          1                    3                    79          2                    4                    160         2                    31           张三     80          2                    4                    81          1                    3                    161         1                    21           王五     79          3                    5                    66          3                    7                    145         3                    52           孙八     89          1                    2                    77          2                    5                    166         1                    12           周九     77          2                    6                    53          3                    8                    130         3                    82           钱七     66          3                    7                    89          1                    2                    155         2                    43           钱二     91          1                    1                    42          3                    9                    133         2                    73           吴十     53          2                    8                    91          1                    1                    144         1                    63           杨一     42          3                    9                    74          2                    6                    116         3                    9(9 row(s) affected) 


[解决办法]

SQL code
---By 苦苦的潜行者create table t1(班 int,姓名 varchar(10),语文 int,数学 int,总分 int)insert t1select 1,    '张三',    80,    81,null union all    select 1,    '张四',    81,    79,null union all        select 1,    '王五',    79,    66,null    union allselect 2,    '钱七',    66,    89,null    union allselect 2,    '孙八',    89,    77,null    union allselect 2,    '周九',    77,    53,null    union allselect 3,    '吴十',    53,    91,null    union allselect 3,    '钱二',    91,    42,null    union allselect 3,    '杨一',    42,    74,null    go;with sumscore(班,语文,数学,总分) as(    select 班,SUM(语文),SUM(数学),SUM(语文+数学)     from t1 group by 班),hashtable(班,姓名,语文,语文班名次,数学,数学班名次,总分,总分班名次,语文总分,数学总分,所有总分)as(select a.班 ,a.姓名 ,a.语文,语文班名次=ROW_NUMBER()over(order by a.语文 desc),a.数学 ,数学班名次=ROW_NUMBER()over(order by a.数学 desc ),总分=a.语文+a.数学,总分班名次=ROW_NUMBER()over(order by a.语文+a.数学 desc),b.语文 ,b.数学 ,b.总分 from t1 aleft join sumscore b on b.班=a.班 where a.班=1union allselect a.班 ,a.姓名 ,a.语文,语文班名次=ROW_NUMBER()over(order by a.语文 desc),a.数学 ,数学班名次=ROW_NUMBER()over(order by a.数学 desc ),总分=a.语文+a.数学,总分班名次=ROW_NUMBER()over(order by a.语文+a.数学 desc),b.语文 ,b.数学 ,b.总分 from t1 aleft join sumscore b on b.班=a.班 where a.班=2union allselect a.班 ,a.姓名 ,a.语文,语文班名次=ROW_NUMBER()over(order by a.语文 desc),a.数学 ,数学班名次=ROW_NUMBER()over(order by a.数学 desc ),总分=a.语文+a.数学,总分班名次=ROW_NUMBER()over(order by a.语文+a.数学 desc),b.语文 ,b.数学 ,b.总分 from t1 aleft join sumscore b on b.班=a.班 where a.班=3--select o.班,o.姓名,o.语文,o.语文班名次,o.数学,o.数学班名次,o.总分,o.总分班名次,o.语文总分,o.数学总分,o.所有总分 --from hashtable o--join sumscore p on o.班=p.班  --where o.班<=3 )select a.班 ,a.姓名 ,a.语文,a.语文班名次 ,语文校名次=ROW_NUMBER()over(order by a.语文 desc),a.数学,a.数学班名次 ,数学校名次=ROW_NUMBER()over(order by a.数学 desc),a.总分,a.总分班名次 ,总分校名次=ROW_NUMBER()over(order by a.总分 desc)from hashtable a order by a.班  /*班 姓名 语文  语文班名次   语文校名次 数学  数学班名次  总分 总分班名次 总分校名次-- --   --    --------       ------    ---    ------    ---    -------    --------1    张三    80    2    4    81    1    3    161    1    21    张四    81    1    3    79    2    4    160    2    31    王五    79    3    5    66    3    7    145    3    52    钱七    66    3    7    89    1    2    155    1    42    周九    77    2    6    53    3    8    130    3    82    孙八    89    1    2    77    2    5    166    2    13    杨一    42    3    9    74    2    6    116    2    93    吴十    53    2    8    91    1    1    144    1    63    钱二    91    1    1    42    3    9    133    3    7*/godrop table t1 

热点排行