oracle 高级sql 列转行

lhlove271015 2012-11-22 11:35:26
有一个表 grade,其字段和记录如下:
course score
语文 88
数学 67
英语 55

要求查询的结果如下:
语文 数学 英语
优秀 及格 不及格
其中score>=80为优秀 80>score>=60为及格 score<60为不及格

请问用sql怎么写,数据库为oracle,谢谢大家了
...全文
443 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
黑色的熊猫 2012-12-07
  • 打赏
  • 举报
回复
如果科目有很多要不确定,后面要增加新的科目是不是要改SQL语句。
善若止水 2012-12-07
  • 打赏
  • 举报
回复
按照这个,你绝对满意,我已经验证过了。先把等级描述出来,再提取。 SELECT max(DECODE(M.COURSE, '语文', M.RANK_DESC)) 语文, max(DECODE(M.COURSE, '数学', M.RANK_DESC)) 数学, max(DECODE(M.COURSE, '英语', M.RANK_DESC)) 英语 FROM (SELECT T.COURSE, T.SCORE, CASE WHEN T.SCORE >= 80 THEN '优秀' WHEN T.SCORE >= 60 AND T.SCORE < 80 THEN '及格' ELSE '不及格' END RANK_DESC FROM GRADE T) M
sky_08_06_02 2012-12-06
  • 打赏
  • 举报
回复
用case when或者加个视图
qq53090120 2012-12-05
  • 打赏
  • 举报
回复
其实就是用case when 来操作
fatfoxz 2012-11-23
  • 打赏
  • 举报
回复
啊,没注意还要以科目为列名。。。。
fatfoxz 2012-11-23
  • 打赏
  • 举报
回复
执行结果: course result 1 yingyu Failed 2 shuxue Pass 3 yuwen Good
fatfoxz 2012-11-23
  • 打赏
  • 举报
回复
上面两个结果不太符合实际应用,实际应用肯定得把score>=80为优秀 80>score>=60为及格 score<60为不及格 也定义到表里,然后用表连接的方式取得结果。 所以这个SQL应该这样写: WITH t_fen AS (SELECT 'yuwen' course, 88 score FROM dual UNION SELECT 'shuxue' course, 67 score FROM dual UNION SELECT 'yingyu' course, 55 score FROM dual), m_fen AS (SELECT 80 minfen, 101 maxfen, 'Good' result FROM dual UNION SELECT 60 minfen, 80 maxfen, 'Pass' result FROM dual UNION SELECT 0 minfen, 60 maxfen, 'Failed' result FROM dual) SELECT t.course, m.result FROM t_fen t left join m_fen m ON t.score >= m.minfen AND t.score <= m.maxfen
小海葵1 2012-11-23
  • 打赏
  • 举报
回复
借用楼上大哥的数据啦。 SELECT (case when Chinese >= 80 then '优秀' when Chinese < 80 and Chinese >= 60 then '及格' else '不及格' end) AS Chinese, (case when Math >= 80 then '优秀' when Math < 80 and Math >= 60 then '及格' else '不及格' end) AS Math, (case when English >= 80 then '优秀' when English < 80 and English >= 60 then '及格' else '不及格' end) AS English from (select * from t pivot(max(score) for course in ('语文' as Chinese, '数学' AS Math, '英语' AS English)))
软件钢琴师 2012-11-23
  • 打赏
  • 举报
回复
WITH  t as (
SELECT '语文' course,88 score from dual
union 
SELECT '数学' course,67 score from dual
union
SELECT '英语' course,55 score from dual
)

SELECT (case when 语文>=80 then '优秀' when 语文<80 and 语文>=60 then '及格' else '不及格' end) 语文, 
(case when 数学>=80 then '优秀' when 数学<80 and 数学>=60 then '及格' else '不及格' end) 数学,
(case when 英语>=80 then '优秀' when 英语<80 and 英语>=60 then '及格' else '不及格' end) 英语
from (select
   MAX(decode(course, '语文', score, NULL)) AS 语文,
   MAX(decode(course, '数学', score, NULL)) AS 数学,
   MAX(decode(course, '英语', score, NULL)) AS 英语
   FROM t); 

3,499

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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