面试遇到的,没做出来。
原始表:
name course score
-----------------------------------------
张三 语文 80
张三 数学 75
张三 外语 60
李四 语文 90
李四 数学 85
李四 外语 70
王五 语文 95
王五 数学 80
王五 外语 75
结果表:
姓名 语文 数学 外语
-----------------------------------------
张三 80 75 60
李四 90 85 70
王五 95 80 75
=========================================
方法一:select name, sum(case when course = "语文" then score else 0 end) "语文",
sum(case when course = "数学" then score else 0 end) "数学",
sum(case when course = "外语" then score else 0 end) "外语"
from table1 group by name;
方法二:SELECT name,SUM(DECODE(course,'语文',score,0)),SUM(DECODE(course,'数学',score,0)),SUM(DECODE(course,'外语',score,0)) from tb1 GROUP BY name;
方法三:select name,max(case when course='语文' then score end) "语文",
max(case when course='数学' then score end) "数学",
max(case when course='外语' then score end) "外语"
from table_name group by name;
------------------------------------------------------------------------------------------------
另:
原始表:
city volume
---------------------
北京 16000
东莞 5000
上海 200000
广州 8500
湛江 100000
结果表:
城市 排名
---------------------
北京 3
东莞 5
上海 1
广州 4
湛江 2
方法一:select city, row_number() over(order by volume desc) "排名" from table2;
方法二:SELECT city "城市",rownum "排名" from tb2 ORDER BY volume DESC
方法三:select city "城市",row_number() over(order by volume desc) as "排名" from tb2 order by rowid;
注:1、SUM 函数返回数值列的总数(总额);
2、开窗函数row_number() over()
表示根据col1分组,在分组内部根据 col2排序
而这个“别名”的值就表示每组内部排序后的顺序编号(组内连续的唯一的),[partition by col1] 可省略。
ROW_NUMBER() OVER (ORDER BY pubtime desc) AS RowNumber
其实就是根据pubtime的大小排序,然后将RowNumber标上行号。
一般此方法多用与高效率分页