【Analytic】分析函式之COUNT函式

secooler發表於2010-01-14
我們透過這個文章來看一下COUNT函式的用法。這篇文章將帶給您一種超乎平常的“COUNT感覺”。
【Analytic】分析函式之MIN函式:http://space.itpub.net/519536/viewspace-624736
【Analytic】分析函式之MAX函式:http://space.itpub.net/519536/viewspace-624749
【Analytic】分析函式之AVG函式:http://space.itpub.net/519536/viewspace-624799
【Analytic】分析函式之ROW_NUMBER函式:http://space.itpub.net/519536/viewspace-624886
【Analytic】分析函式之RANK函式:http://space.itpub.net/519536/viewspace-624985
【Analytic】分析函式之DENSE_RANK函式:http://space.itpub.net/519536/viewspace-625115

1.萬變不離其宗,先看COUNT函式的語法描述。

COUNT({ * | [ DISTINCT | ALL ] expr })
   [ OVER (analytic_clause) ]

2.透過實驗看一下普通COUNT函式和分析函式COUNT的使用方法
1)建立測試表T,並初始化9條資料。
sec@ora10g> create table t (group_id number(10), name varchar2(10), salary int);
sec@ora10g> insert into t values (1,'Tom',1200);
sec@ora10g> insert into t values (2,'Kary',2400);
sec@ora10g> insert into t values (2,'Joe',800);
sec@ora10g> insert into t values (3,'Andy',100);
sec@ora10g> insert into t values (3,'Ellen',200);
sec@ora10g> insert into t values (3,'Erick',300);
sec@ora10g> insert into t values (3,'Hou',400);
sec@ora10g> insert into t values (3,'Mary',500);
sec@ora10g> insert into t values (3,'Secooler',600);
sec@ora10g> commit;

2)T表全貌
sec@ora10g> select * from t order by group_id,name;

  GROUP_ID NAME           SALARY
---------- ---------- ----------
         1 Tom              1200
         2 Joe               800
         2 Kary             2400
         3 Andy              100
         3 Ellen             200
         3 Erick             300
         3 Hou               400
         3 Mary              500
         3 Secooler          600

9 rows selected.

共三組資料,group_id分別是1、2和3。第1組有一個人,第2組有兩個人,第3組有六個人。最後一列是每個人的薪水值。

3)普通COUNT函式使用方法,地球人都知道。不過要注意,要結合group by分組使用。
sec@ora10g> select group_id, count(*) from t group by group_id;

  GROUP_ID   COUNT(*)
---------- ----------
         1          1
         2          2
         3          6

4)分析函式COUNT的混合使用方法
sec@ora10g> col name for a10
sec@ora10g> select group_id, name, salary, count(*) over () as count1, count(*) over (order by salary) as count2,count(*) over (order by salary range between 200 preceding and 300 following) as count3 from t order by group_id, name;

  GROUP_ID NAME           SALARY     COUNT1     COUNT2     COUNT3
---------- ---------- ---------- ---------- ---------- ----------
         1 Tom              1200          9          8          1
         2 Joe               800          9          7          2
         2 Kary             2400          9          9          1
         3 Andy              100          9          1          4
         3 Ellen             200          9          2          5
         3 Erick             300          9          3          6
         3 Hou               400          9          4          5
         3 Mary              500          9          5          5
         3 Secooler          600          9          6          4

9 rows selected.

COUNT1得到所有參與計算的行的數量(非空);
COUNT2得到比自己薪水少的人數(包括自己在內);
COUNT3得到比自己薪水少200元多300元的人數(包括自己在內)。

3.小結
體驗了COUNT分析函式帶給我我們的神奇之後,您是不是有一種深入探索的衝動。心動不如行動,快使用手邊的資料實驗一番吧,也許有一天在遇到特殊需求時,COUNT分析函式會帶給您另外一種解決方案和便利。
有關分析函式的擴充套件可以參考Oracle的官方文件中的“Analytic Functions”描述:

Good luck.

secooler
10.01.14

-- The End --

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-625191/,如需轉載,請註明出處,否則將追究法律責任。

相關文章