Oracle: 對數據分組(max,min,avg,sum等)的想法


1. 分組函數只能出現在選擇列表(select),having,order by 子句中;

2.如果在select語句中同時包含有group by,having,order by,那麼,他們的優先級是,group by,having和order by

3.在選擇列種,如果有列,表達式和分組函數,那麼,這些列和表達式,必須有一個出現在group by子句中!

EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
 7698 BLAKE      MANAGER    7839 1981/5/1      2850.00               30
 7499 ALLEN      SALESMAN   7698 1981/2/20     1600.00    300.00     30
 7844 TURNER     SALESMAN   7698 1981/9/8      1500.00      0.00     30
 7654 MARTIN     SALESMAN   7698 1981/9/28     1250.00   1400.00     30
 7521 WARD       SALESMAN   7698 1981/2/22     1250.00    500.00     30
 7900 JAMES      CLERK      7698 1981/12/3      950.00               30
 7788 SCOTT      ANALYST    7566 1987/4/19     3000.00               20
 7902 FORD       ANALYST    7566 1981/12/3     3000.00               20
 7566 JONES      MANAGER    7839 1981/4/2      2975.00               20
 7876 ADAMS      CLERK      7788 1987/5/23     1100.00               20
 7370 Jonny      clerk      7902 1999/11/11    1000.00               20
 7369 SMITH      CLERK      7902 1980/12/17     800.00               20
 7839 KING       PRESIDENT       1981/11/17    5000.00               10
 7782 CLARK      MANAGER    7839 1981/6/9      2450.00               10
 7934 MILLER     CLERK      7782 1982/1/23     1300.00               10
</pre><pre name="code" class="sql">//以年薪排序
SQL> select empno,ename,job, sal,comm,  sal*12+nvl(comm,0)*12 "年薪"from emp order by "年薪" desc;
EMPNO ENAME      JOB             SAL      COMM         年薪
----- ---------- --------- --------- --------- ----------
 7839 KING       PRESIDENT   5000.00                60000
 7902 FORD       ANALYST     3000.00                36000
 7788 SCOTT      ANALYST     3000.00                36000
 7566 JONES      MANAGER     2975.00                35700
 7698 BLAKE      MANAGER     2850.00                34200
 7654 MARTIN     SALESMAN    1250.00   1400.00      31800
 7782 CLARK      MANAGER     2450.00                29400
 7499 ALLEN      SALESMAN    1600.00    300.00      22800
 7521 WARD       SALESMAN    1250.00    500.00      21000
 7844 TURNER     SALESMAN    1500.00      0.00      18000
 7934 MILLER     CLERK       1300.00                15600
 7876 ADAMS      CLERK       1100.00                13200
 7370 Jonny      clerk       1000.00                12000
 7900 JAMES      CLERK        950.00                11400
 7369 SMITH      CLERK        800.00                 9600
//數據分組
SQL> select max(sal), min(sal) from emp;
  MAX(SAL)   MIN(SAL)
---------- ----------
      5000        800

//針對第一條的範例
SQL> select * from emp where sal=(select max(sal) from emp);
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
 7839 KING       PRESIDENT       1981/11/17    5000.00               10
Executed in 0.03 seconds
SQL> select * from emp where sal=(select max(sal) from emp) or sal = (select min(sal) from emp);
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
 7369 SMITH      CLERK      7902 1980/12/17     800.00               20
 7839 KING       PRESIDENT       1981/11/17    5000.00               10
Executed in 0.035 seconds
//針對【三】的範例
SQL> select avg(sal),max(sal), deptno from emp group by deptno;
  AVG(SAL)   MAX(SAL) DEPTNO
---------- ---------- ------
1566.66666       2850     30
1979.16666       3000     20
2916.66666       5000     10
Executed in 0.051 seconds

//having 的用法
SQL> select avg(sal),deptno from emp group by deptno having avg(sal)<2000;
  AVG(SAL) DEPTNO
---------- ------
1566.66666     30
1979.16666     20
Executed in 0.039 seconds

//語句的集合
SQL> select avg(sal),max(sal),deptno from emp
  2  group by deptno
  3  having avg(sal)>1800
  4  order by avg(sal) desc; 
  AVG(SAL)   MAX(SAL) DEPTNO
---------- ---------- ------
2916.66666       5000     10
1979.16666       3000     20
Executed in 0.036 seconds

//group by 後跟表達式
SQL> select ename,job,sal*12+nvl(comm,0)*12 as "Subtotal Sal",avg(sal),max(sal) from emp
  2  group by ename,job,sal*12+nvl(comm,0)*12;
ENAME      JOB       Subtotal Sal   AVG(SAL)   MAX(SAL)
---------- --------- ------------ ---------- ----------
JONES      MANAGER          35700       2975       2975
ADAMS      CLERK            13200       1100       1100
JAMES      CLERK            11400        950        950
Jonny      clerk            12000       1000       1000
CLARK      MANAGER          29400       2450       2450
SMITH      CLERK             9600        800        800
TURNER     SALESMAN         18000       1500       1500
FORD       ANALYST          36000       3000       3000
MARTIN     SALESMAN         31800       1250       1250
ALLEN      SALESMAN         22800       1600       1600
BLAKE      MANAGER          34200       2850       2850
KING       PRESIDENT        60000       5000       5000
MILLER     CLERK            15600       1300       1300
WARD       SALESMAN         21000       1250       1250
SCOTT      ANALYST          36000       3000       3000
15 rows selected
Executed in 0.123 seconds
<pre name="code" class="sql">
//全套
SQL> select ename,job,sal*12+nvl(comm,0)*12 as "Subtotal Sal",avg(sal),max(sal) from emp
  2  group by ename,job,sal*12+nvl(comm,0)*12
  3  having avg(sal)> 1000
  4  order by "Subtotal Sal" desc;
ENAME      JOB       Subtotal Sal   AVG(SAL)   MAX(SAL)
---------- --------- ------------ ---------- ----------
KING       PRESIDENT        60000       5000       5000
FORD       ANALYST          36000       3000       3000
SCOTT      ANALYST          36000       3000       3000
JONES      MANAGER          35700       2975       2975
BLAKE      MANAGER          34200       2850       2850
MARTIN     SALESMAN         31800       1250       1250
CLARK      MANAGER          29400       2450       2450
ALLEN      SALESMAN         22800       1600       1600
WARD       SALESMAN         21000       1250       1250
TURNER     SALESMAN         18000       1500       1500
MILLER     CLERK            15600       1300       1300
ADAMS      CLERK            13200       1100       1100
12 rows selected
Executed in 0.098 seconds






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