求有条件求和的语句

l445306254 2010-03-10 07:40:08
sqlserver 中有一成绩表!!

学生id 语文 数学 总分

录入分数时,如果是-1,就表明该学生该科缺考,总分时就不算,还要按总分排序,返回的结果有名次!如何写sql 语句??谢谢!!
...全文
70 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
东那个升 2010-03-10
  • 打赏
  • 举报
回复

--并列的
SELECT *
,( SELECT COUNT(DISTINCT 学生ID)
FROM tb B
WHERE (case when B.语文=-1 or B.数学=-1 then 0 else B.语文+B.数学 END)<(case when A.语文=-1 or A.数学=-1 then 0 else A.语文+A.数学 END)
)+1 AS 排名
FROM tb A

--不并列的
SELECT *
,( SELECT COUNT(*)
FROM tb B
WHERE (case when B.语文=-1 or B.数学=-1 then 0 else B.语文+B.数学 END)<(case when A.语文=-1 or A.数学=-1 then 0 else A.语文+A.数学 END)
)+1 AS 排名
FROM tb A
l445306254 2010-03-10
  • 打赏
  • 举报
回复
我用的是sql2000 不支持dense_rank() 它呀!!怎么办??
黄_瓜 2010-03-10
  • 打赏
  • 举报
回复
发两遍?
--2005
select *,名次=row_number() /*总分相同的名次并列的 将row_number 换成dense_rank*/over(order by 总分 desc)
from
(
select 学生id,语文, 数学, 总分=case when 语文=-1 then 0 else 语文 end
+case when 数学=-1 then 0 else 数学 end
from tb
) t
l445306254 2010-03-10
  • 打赏
  • 举报
回复
请问1楼,我如何能按总分取得名次列呢??
东那个升 2010-03-10
  • 打赏
  • 举报
回复
select *,排名=dense_rank() over(order by 总分 desc)
from(
select 学生ID,语文,数学case when 语文=-1 or 数学=-1 then 0 else 语文+数学 end as 总分
from tb
) t


分数一样是并列
东那个升 2010-03-10
  • 打赏
  • 举报
回复
select 学生id,语文,数学,case when 语文=-1 or 数学=-1 then 总分 else 语文+数学 end as 总分
from 成绩表
order by case when 语文=-1 or 数学=-1 then 总分 else 语文+数学 end as 总分
百年树人 2010-03-10
  • 打赏
  • 举报
回复
select *,排名=rank() over(order by 总分 desc)
from(
select 学生ID,case when 语文=-1 or 数学=-1 then 0 else 语文+数学 end as 总分
from tb
) t
order by 3
--小F-- 2010-03-10
  • 打赏
  • 举报
回复
select
学生id,sum(case when 语文<>-1 and 数学<>-1 then 语文+数学 else 0 end) as 总分
from
tb
group by
学生id

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧