Oracle 按照伪列总分分组 分组之后得到每组的前三列。
有一学生表,有三个成绩chinese,maths,english,我要加一个伪列成绩总分表下面是我写的伪列统计总分表selectclassid,chinese,maths...
有一学生表,有三个成绩chinese,maths,english, 我要加一个伪列 成绩总分表
下面是我写的伪列统计总分表
select classid,chinese,maths,english, nvl(chinese,0)+ nvl(maths,0)+ nvl(english,0) 成绩和 from grade
用分组的话是这样的
SELECT * FROM (SELECT T.*, ROW_NUMBER() OVER(PARTITION BY classid ORDER BY english DESC) 总分 FROM grade T) WHERE 总分 < 4
这样只能用english分数大小排名,但是我想用伪列排名 我把english换成(select nvl(chinese,0)+ nvl(maths,0)+ nvl(english,0) 成绩和 from grade)报错单个子查询返回多个值。
求大神指教。 展开
下面是我写的伪列统计总分表
select classid,chinese,maths,english, nvl(chinese,0)+ nvl(maths,0)+ nvl(english,0) 成绩和 from grade
用分组的话是这样的
SELECT * FROM (SELECT T.*, ROW_NUMBER() OVER(PARTITION BY classid ORDER BY english DESC) 总分 FROM grade T) WHERE 总分 < 4
这样只能用english分数大小排名,但是我想用伪列排名 我把english换成(select nvl(chinese,0)+ nvl(maths,0)+ nvl(english,0) 成绩和 from grade)报错单个子查询返回多个值。
求大神指教。 展开
展开全部
多加一层嵌套语句就能解决这个问题
SELECT T.*
FROM (
SELECT classid,chinese,maths,english, nvl(chinese,0)+ nvl(maths,0)+ nvl(english,0) total
FROM grade
) T
WHERE total < 4
ORDER BY total desc
当然,如果希望获取number号,进行分页,外面再增加一层即可
SELECT T.*
FROM (
SELECT classid,chinese,maths,english, nvl(chinese,0)+ nvl(maths,0)+ nvl(english,0) total
FROM grade
) T
WHERE total < 4
ORDER BY total desc
当然,如果希望获取number号,进行分页,外面再增加一层即可
追问
查询出来什么都没有
追答
看你有个总分<4,把那个去掉就能查询出来了。希望增加排名的话,可以使用下面的语句
SELECT tt.*, ROWNUM RN
FROM
(SELECT T.*
FROM (
SELECT classid,chinese,maths,english, nvl(chinese,0)+ nvl(maths,0)+ nvl(english,0) total
FROM grade
) T
ORDER BY total desc
) tt
展开全部
试试
SELECT * FROM (SELECT T.*, ROW_NUMBER() OVER(PARTITION BY classid ORDER BY 总分 DESC) 总分 FROM
(select classid,chinese,maths,english, nvl(chinese,0)+ nvl(maths,0)+ nvl(english,0) 总分 from grade)
T) WHERE 总分 < 4
SELECT * FROM (SELECT T.*, ROW_NUMBER() OVER(PARTITION BY classid ORDER BY 总分 DESC) 总分 FROM
(select classid,chinese,maths,english, nvl(chinese,0)+ nvl(maths,0)+ nvl(english,0) 总分 from grade)
T) WHERE 总分 < 4
更多追问追答
追问
不行的,我试过了,无效字符
追答
那个是无效字符 ?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
难道把english换成nvl(chinese,0)+ nvl(maths,0)+ nvl(english,0)不行吗?
LZ时想取总分前三的排名,classid是相同的吗?不同的话用PARTITION分组取出的排序全是1,这样排序就失去意义,试试
SELECT * FROM (SELECT T.*, ROW_NUMBER() OVER(ORDER BY nvl(chinese,0)+ nvl(maths,0)+ nvl(english,0) DESC) 总分 FROM grade T) WHERE 总分 < 4
LZ时想取总分前三的排名,classid是相同的吗?不同的话用PARTITION分组取出的排序全是1,这样排序就失去意义,试试
SELECT * FROM (SELECT T.*, ROW_NUMBER() OVER(ORDER BY nvl(chinese,0)+ nvl(maths,0)+ nvl(english,0) DESC) 总分 FROM grade T) WHERE 总分 < 4
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询