锁定老帖子 主题:最近面试经常被问的2道sql题
精华帖 (1) :: 良好帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-03-30
最后修改:2012-03-30
----行列互换 select t.* from temp_sc t; select sc.stdname, a.grade 语文, b.grade 数学, c.grade 物理, d.grade 化学 from (select distinct stdname from temp_sc) sc, (select stdname, grade from temp_sc where stdsubject = '语文') a, (select stdname, grade from temp_sc where stdsubject = '数学') b, (select stdname, grade from temp_sc where stdsubject = '物理') c, (select stdname, grade from temp_sc where stdsubject = '化学') d where sc.stdname = a.stdname and sc.stdname = b.stdname and sc.stdname = c.stdname and sc.stdname = d.stdname; ![]() ![]() 二、树 --从哪条开始 start with --连表条件 connect by --往上还是往下 prior --从哪条开始 start with --连表条件 connect by --往上还是往下 prior select * from tbl_tree start with uuid = 1 connect by prior uuid = puuid order by puuid ![]() 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-03-31
最后修改:2012-03-31
第一个也可以这么写。
SELECT STDNAME, (CASE WHEN STDSUBJECT = '语文' THEN GRADE END) AS '语文', (CASE WHEN STDSUBJECT = '数学' THEN GRADE END) AS '数学' ,(CASE WHEN STDSUBJECT = '化学' THEN GRADE END) AS '化学' ,(CASE WHEN STDSUBJECT = '物理' THEN GRADE END) AS '物理' FROM TEMP_SC group by stdname; |
|
返回顶楼 | |
发表时间:2012-03-31
select t.stuname,
substr(wm_concat(t.grade),1, 2) 语文, substr(wm_concat(t.grade),4, 2) 数学, substr(wm_concat(t.grade), 7, 2) 物理, substr(wm_concat(t.grade), 10, 2) 化学 from student t group by t.stuname 要是oralce有分割字符串的函数更方便 ,可以自己写个过程神马的 |
|
返回顶楼 | |
发表时间:2012-03-31
最后修改:2012-03-31
学习了,原来这么简单啊,兄台,有没有行转列的sql,发出了参考一下
|
|
返回顶楼 | |
发表时间:2012-03-31
最后修改:2012-03-31
lan861698789 写道 第一个也可以这么写。
SELECT STDNAME, (CASE WHEN STDSUBJECT = '语文' THEN GRADE END) AS '语文', (CASE WHEN STDSUBJECT = '数学' THEN GRADE END) AS '数学' ,(CASE WHEN STDSUBJECT = '化学' THEN GRADE END) AS '化学' ,(CASE WHEN STDSUBJECT = '物理' THEN GRADE END) AS '物理' FROM TEMP_SC group by stdname; 你的这个实现思路是没有问题的,但是细节上有问题,还是应该用个聚合函数吧,否则结果不正确。 SELECT studentname, SUM(CASE WHEN subjectname = 'chinese' THEN subjectscore END) AS 语文, SUM(CASE WHEN subjectname = 'math' THEN subjectscore END) AS 数学, SUM(CASE WHEN subjectname = 'english' THEN subjectscore END) AS 外语 FROM tbl_info GROUP BY studentname; 看了楼主给出的第二个解决方案,根据那个查询结果我觉得就直接根据puuid排序就好了,没啥其他的。不知楼主的意图,可能是题目没有表述清楚。 |
|
返回顶楼 | |
发表时间:2012-03-31
edisonlv2010 写道 lan861698789 写道 第一个也可以这么写。
SELECT STDNAME, (CASE WHEN STDSUBJECT = '语文' THEN GRADE END) AS '语文', (CASE WHEN STDSUBJECT = '数学' THEN GRADE END) AS '数学' ,(CASE WHEN STDSUBJECT = '化学' THEN GRADE END) AS '化学' ,(CASE WHEN STDSUBJECT = '物理' THEN GRADE END) AS '物理' FROM TEMP_SC group by stdname; 你的这个实现思路是没有问题的,但是细节上有问题,还是应该用个聚合函数吧,否则结果不正确。 SELECT studentname, SUM(CASE WHEN subjectname = 'chinese' THEN subjectscore END) AS 语文, SUM(CASE WHEN subjectname = 'math' THEN subjectscore END) AS 数学, SUM(CASE WHEN subjectname = 'english' THEN subjectscore END) AS 外语 FROM tbl_info GROUP BY studentname; 看了楼主给出的第二个解决方案,根据那个查询结果我觉得就直接根据puuid排序就好了,没啥其他的。不知楼主的意图,可能是题目没有表述清楚。 可能我真的没表述清楚,这树是查找子孙节点吗,比如我查找上海下面的节点就start with uuid=5 |
|
返回顶楼 | |
发表时间:2012-03-31
SELECT
studentname, SUM(CASE WHEN subjectname = 'chinese' THEN subjectscore END) AS 语文, SUM(CASE WHEN subjectname = 'math' THEN subjectscore END) AS 数学, SUM(CASE WHEN subjectname = 'english' THEN subjectscore END) AS 外语 FROM tbl_info GROUP BY studentname; 方法正确,sum可以换成min、max、avg都可以,有人知道原因吗? 请姐?????? |
|
返回顶楼 | |
发表时间:2012-03-31
mianhuatangone 写道 SELECT
studentname, SUM(CASE WHEN subjectname = 'chinese' THEN subjectscore END) AS 语文, SUM(CASE WHEN subjectname = 'math' THEN subjectscore END) AS 数学, SUM(CASE WHEN subjectname = 'english' THEN subjectscore END) AS 外语 FROM tbl_info GROUP BY studentname; 方法正确,sum可以换成min、max、avg都可以,有人知道原因吗? 请姐?????? 因为groupby分组了 要用分组函数 |
|
返回顶楼 | |
发表时间:2012-03-31
zfcejb 写道 edisonlv2010 写道 lan861698789 写道 第一个也可以这么写。
SELECT STDNAME, (CASE WHEN STDSUBJECT = '语文' THEN GRADE END) AS '语文', (CASE WHEN STDSUBJECT = '数学' THEN GRADE END) AS '数学' ,(CASE WHEN STDSUBJECT = '化学' THEN GRADE END) AS '化学' ,(CASE WHEN STDSUBJECT = '物理' THEN GRADE END) AS '物理' FROM TEMP_SC group by stdname; 你的这个实现思路是没有问题的,但是细节上有问题,还是应该用个聚合函数吧,否则结果不正确。 SELECT studentname, SUM(CASE WHEN subjectname = 'chinese' THEN subjectscore END) AS 语文, SUM(CASE WHEN subjectname = 'math' THEN subjectscore END) AS 数学, SUM(CASE WHEN subjectname = 'english' THEN subjectscore END) AS 外语 FROM tbl_info GROUP BY studentname; 看了楼主给出的第二个解决方案,根据那个查询结果我觉得就直接根据puuid排序就好了,没啥其他的。不知楼主的意图,可能是题目没有表述清楚。 可能我真的没表述清楚,这树是查找子孙节点吗,比如我查找上海下面的节点就start with uuid=5 哦,明白了,谢谢指教! |
|
返回顶楼 | |
发表时间:2012-03-31
mianhuatangone 写道 SELECT
studentname, SUM(CASE WHEN subjectname = 'chinese' THEN subjectscore END) AS 语文, SUM(CASE WHEN subjectname = 'math' THEN subjectscore END) AS 数学, SUM(CASE WHEN subjectname = 'english' THEN subjectscore END) AS 外语 FROM tbl_info GROUP BY studentname; 方法正确,sum可以换成min、max、avg都可以,有人知道原因吗? 请姐?????? 之所以结果都是一样的,是因为分组内匹配的记录都只有1条,所以用各种聚合函数的结果都是一样的. |
|
返回顶楼 | |