论坛首页 招聘求职论坛

最近面试经常被问的2道sql题

浏览 10419 次
精华帖 (1) :: 良好帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-03-30   最后修改:2012-03-30
一、oracle横列转换
----行列互换
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



  • 大小: 23.6 KB
  • 大小: 15.2 KB
  • 大小: 23.6 KB
   发表时间: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;
0 请登录后投票
   发表时间: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有分割字符串的函数更方便 ,可以自己写个过程神马的
0 请登录后投票
   发表时间:2012-03-31   最后修改:2012-03-31
学习了,原来这么简单啊,兄台,有没有行转列的sql,发出了参考一下
0 请登录后投票
   发表时间: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排序就好了,没啥其他的。不知楼主的意图,可能是题目没有表述清楚。

0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间: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都可以,有人知道原因吗?
请姐??????
0 请登录后投票
   发表时间: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分组了  要用分组函数
0 请登录后投票
   发表时间: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


哦,明白了,谢谢指教!
0 请登录后投票
   发表时间: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条,所以用各种聚合函数的结果都是一样的.
0 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics