//数据: 车厢 旅客人数 价格 餐别 日期 车次 一等车厢 30 30 米饭 2011-4-1 T40 二等车厢 70 15 三明治 2011-4-1 T40 三等车厢 100 8 面包 2011-4-1 T40 //结果: 车次 日期 一等车厢 二等车厢 三等车厢 ---- -------- ------------------------ ---------------------------------- ---------------------------------- 餐别 价格 旅客 餐别 价格 旅客 餐别 价格 旅客 T40 2011-4-1 米饭 30 30 三明 15 70 面包 8 100 //解法: with test as( select '一等车厢' 车厢, 30 旅客人数, 30 价格, '米饭' 餐别, '2011-4-1' 日期, 'T40' 车次 from dual union all select '二等车厢', 70 , 15, '三明治', '2011-4-1', 'T40' from dual union all select '三等车厢', 100, 8, '面包', '2011-4-1', 'T40' from dual) select 车次,日期, max(Decode(车厢,'一等车厢',rpad(餐别,5,' ')||' '||rpad(价格,5,' ')||' '||rpad(旅客人数,5,' '))) as "一等车厢", max(Decode(车厢,'二等车厢',rpad(餐别,5,' ')||' '||rpad(价格,5,' ')||' '||rpad(旅客人数,5,' '))) as "二等车厢", max(Decode(车厢,'三等车厢',rpad(餐别,5,' ')||' '||rpad(价格,5,' ')||' '||rpad(旅客人数,5,' '))) as "三等车厢" from test group by 车次,日期 union all select '','', rpad('餐别',5,' ')||' '||rpad('价格',5,' ')||' '||rpad('旅客人数',5,' '), rpad('餐别',5,' ')||' '||rpad('价格',5,' ')||' '||rpad('旅客人数',5,' '), rpad('餐别',5,' ')||' '||rpad('价格',5,' ')||' '||rpad('旅客人数',5,' ') from test where rownum=1 order by 1 nulls first / //下面我们来分解这个查询: //最上面这个查询,其实是一个普通的将列转换为行的写法: select 车次,日期, max(Decode(车厢,'一等车厢',rpad(餐别,5,' ')||' '||rpad(价格,5,' ')||' '||rpad(旅客人数,5,' '))) as "一等车厢", max(Decode(车厢,'二等车厢',rpad(餐别,5,' ')||' '||rpad(价格,5,' ')||' '||rpad(旅客人数,5,' '))) as "二等车厢", max(Decode(车厢,'三等车厢',rpad(餐别,5,' ')||' '||rpad(价格,5,' ')||' '||rpad(旅客人数,5,' '))) as "三等车厢" from test group by 车次,日期 / 车次 日期 一等车厢 二等车厢 三等车厢 ---- -------- ---------------------------------- ---------------------------------- ---------------------------------- T40 2011-4-1 米饭 30 30 三明 15 70 面包 8 100 // //下面一个查询,构造以上面一个查询得到的字段数目,但是这里只是构造数据,用来显示结果中第一行的要求: with test as( select '一等车厢' 车厢, 30 旅客人数, 30 价格, '米饭' 餐别, '2011-4-1' 日期, 'T40' 车次 from dual union all select '二等车厢', 70 , 15, '三明治', '2011-4-1', 'T40' from dual union all select '三等车厢', 100, 8, '面包', '2011-4-1', 'T40' from dual) select '','', rpad('餐别',5,' ')||' '||rpad('价格',5,' ')||' '||rpad('旅客人数',5,' '), rpad('餐别',5,' ')||' '||rpad('价格',5,' ')||' '||rpad('旅客人数',5,' '), rpad('餐别',5,' ')||' '||rpad('价格',5,' ')||' '||rpad('旅客人数',5,' ') from test / //这样会返回三条记录,而我们只需要一条记录,所以加上了一个rownum=1来限制获取的行数。 //最后,在查询的后面加上一个排序子句, //order by nulls first:它限制了将null值排在前面,如果按照nulls last排序,那么空值将会排序在最后面。 //如果Order by 中指定了表达式Nulls first则表示null值的记录将排在最前。 //如果Order by 中指定了表达式Nulls last则表示null值的记录将排在最后。 select * from employee; EMPNO ENAME HIREDATE ORIG_SALARY CURR_SALARY R ---------- ---------- --------- ----------- ----------- - 122 Alison 21-MAR-96 45000 E 123 James 12-DEC-78 23000 32000 W 104 Celia 24-OCT-82 58000 E 105 Robert 15-JAN-84 31000 W 116 Linda 30-JUL-87 53000 E 117 David 31-DEC-90 78000 W 108 Jode 17-SEP-96 21000 29000 E SELECT empno, ename, curr_salary, ROW_NUMBER() OVER(ORDER BY curr_salary desc NULLS LAST) salary FROM employee ORDER BY curr_salary desc NULLS LAST; EMPNO ENAME CURR_SALARY SALARY ---------- ---------- ----------- ---------- 104 Celia 58000 1 116 Linda 53000 2 123 James 32000 3 108 Jode 29000 4 117 David 5 122 Alison 6 105 Robert 7 //
原帖:
参考:
NULLS FIRST: place null value first:
http://www.java2s.com/Code/Oracle/Analytical-Functions/NULLSFIRSTplacenullvaluefirst.htm
The default is NULLS FIRST:
http://www.java2s.com/Code/Oracle/Analytical-Functions/ThedefaultisNULLSFIRST.htm
189

被折叠的 条评论
为什么被折叠?



