Oracle 高級查詢

create table tt as select * from emp;
alter table tt add (sex varchar2(1) default '0' );
select * from tt for update;


-- 職位分別是’MANAGER’、’ANALYST’、’SALESMAN’時,獎勵金額分別是薪水的1.2倍、1.1倍、1.05倍,如果不是這三個職位,則獎勵金額取薪水值:

select  e.empno , e.ename , e.job ,
        decode(
                e.job , 'MANAGER' ,e.sal*1.2,
                      'ANALYST' , e.sal*1.1,
                      'SALESMAN' ,e.sal*1.05,
                      e.sal
        ) bouns 
 from emp e ;
 
 select decode(e.job , 'MANAGER' ,'vip',
                                 'ANALYST' , 'vip',
                                 'OPERATION' ) job  , count(1) countJob from emp e group by decode(e.job , 'MANAGER' ,'vip','ANALYST' , 'vip', 'OPERATION' );
-- 查詢tt表的男女多少(sex 列有可能爲空,不知道男女)?  1 :男 , 0 :女
select count(*) as "性別" from tt where sex='0' union all  select count(*) as "性別" from tt where sex='1';
--decode 實現
select decode(t.sex , '1' , '男'  , '女')  from tt t ;
                       
SELECT deptno, dname, loc
FROM dept
ORDER BY 
      DECODE(dname, '研發部',1,'市場部',2,'銷售部',3), loc;

-- 排序函數 : 
-- row_number() over (partition by c1  order by c2 )       
-- 表示根據c1分組,在分組內部根據c2排序。此函數計算的值就表示每組內部排序後的順序編號,組內連續且唯一
SELECT deptno, ename, empno,
       ROW_NUMBER()
               OVER (PARTITION BY deptno ORDER BY sal)     AS  empSal
   FROM emp;      

-- RANK : rank()  over(partition by  c1 order by c2 )    
--表示根據c1分組,在分組內部根據c2排名,相同的數據返回相同排名。
-- 特點是跳躍排序,如果有相同數據,則排名相同,比如並列第二,則兩行數據都標記爲2,但下一位將是第四名。 
 -- 注意: row_number 結果沒有重複,  rank(); 有重複
 select e.*  , rank() over(partition by e.deptno order by e.sal ) as "e.sal"  from emp e;
 
-- DENSE_RANK:  dense_rank() over ( partition by c1 order by c2 )
--表示根據c1分組,在分組內部根據c2排名,相同的數據返回相同排名。
-- 特點是排序不跳躍,如果有相同數據,則排名相同,比如並列第二,則兩行數據都標記爲2,但下一位將是第3名。 
 -- 注意: row_number 結果沒有重複(相同的數據也沒有重複),  rank(); 有重複
 -- rank() 排名是跳躍的,dense_rank(); 拍名是連續的
 select e.* , dense_rank() over(partition by e.deptno order by e.sal ) as "e.sal" from emp e;
 
 
 -- 高級分組函數:是 GROUP BY 子句的擴展 (簡化union all 的結果,比union all的效率高)
 --GROUP BY ROLLUP(a, b, c)          rollup 彙總
-- GROUP BY CUBE(a, b, c)            cube 立方
-- GROUP BY GROUPING SETS ( (a), (b))      

--SELECT a,b,c,SUM(d) FROM test GROUP BY ROLLUP(a,b,c);
-- 等價於: (group by a, b ,c)  union all  (group by a, b)  union all (group by a ) union all  (select sum(d) from test); 
-- 對ROLLUP的列從右到左以一次少一列的方式進行分組直到所有列都去掉後的分組(也就是全表分組)。
-- 對於n個參數的ROLLUP,有n+1次分組。

-- GROUP BY CUBE(a, b, c)
-- (group by a, b ,c)  union all  (group by a, b )    union all  (group by a, c)  union all  (group by a )  union all  (group by b ,c ) 
 -- union all  (group by b)  union all  (group by c )   union all  (select sum(d) from test); 
 --對cube的每個參數,都可以理解爲取值爲參與分組和不參與分組兩個值的一個維度,
 -- 所有維度取值組合的集合就是分組後的集合。對於n個參數的cube,有2^n次分組。
    
 -- grouping sets
 -- 如果不需要獲得由完備的 ROLLUP 或 CUBE 運算符生成的全部分組,
 -- 則可以使用 GROUPING SETS 僅指定所需的分組。GROUPING SETS 列表可以包含重複的分組。 
 --使用GROUP BY GROUPING SETS(a,b,c),則對(a),(b),(c)進行GROUP BY
 --使用GROUP BY GROUPING SETS((a,b),c), 則對(a,b),(c)進行GROUP BY
 --GROUPING BY GROUPING SET(a,a) , 則對(a)進行2次GROUP BY, GROUPING SETS的參數允許重複
 
                       
 
 
 
 
 
 
 
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章