如何用Oracle實(shí)現(xiàn)組織結(jié)構(gòu)中的匯總統(tǒng)計(jì)
對(duì)于一般的數(shù)據(jù)模型來(lái)說(shuō),一般是有一個(gè)事實(shí)表,若干個(gè)維度表,通過(guò)事實(shí)表與維度表的連接,實(shí)現(xiàn)不同層次的查詢(xún)匯總。
問(wèn)題是對(duì)于組織結(jié)構(gòu)而言,一般所有的數(shù)據(jù)都存貯于一個(gè)表中,而且,組織結(jié)構(gòu)的層次也是動(dòng)態(tài)的。那么,在這種情況下,如何實(shí)現(xiàn)員工工資的匯總呢?一個(gè)比較有趣的問(wèn)題是: 如何統(tǒng)計(jì)員工及其所有被管理員工的總工資,舉個(gè)例子,CEO的總工資就是整個(gè)公司總有員工的總工資之和,包括他自己。
Oracle 引入了一個(gè)擴(kuò)展的運(yùn)算符,專(zhuān)門(mén)用來(lái)處理此種情形,它就是connect_by_root。當(dāng)以connect_by_root修飾一個(gè)列名時(shí),Oracle將返回根節(jié)點(diǎn)對(duì)應(yīng)的此列的值。例如,當(dāng)start with 為 last_name = ‘King’時(shí),這時(shí)返回的所有行的connect_by_root last_name的值都將為’King’。這時(shí),對(duì)所有行的累計(jì)就是對(duì)’King’的數(shù)據(jù)的累計(jì)了。當(dāng)不指定start with 子句時(shí),Oracle將對(duì)每個(gè)節(jié)點(diǎn)依次進(jìn)行遍歷,于是,我們可以對(duì)返回的結(jié)果對(duì)last_name進(jìn)行一次group by,那么我們就得到了所有l(wèi)ast_name對(duì)應(yīng)的匯總工資了。
下面是Oracle 文檔中的例子。
above that employee in the hierarchy, the number of levels between manager and employee, and the path between the two: |
|
Employee Manager Pathlen Path
--------------- --------------- ---------- ------------------------------
Gietz Higgins 1 /Higgins/Gietz
Gietz King 3 /King/Kochhar/Higgins/Gietz
Gietz Kochhar 2 /Kochhar/Higgins/Gietz
Higgins King 2 /King/Kochhar/Higgins
Higgins Kochhar 1 /Kochhar/HigginsThe following example uses a GROUP BY clause to return the total salary of each employee in department 110 and all employees below that employee in the hierarchy:
|
【編輯推薦】