原創|其它|編輯:郝浩|2009-04-27 11:51:33.000|閱讀 2506 次
概述:在Oracle數據庫系統中,對于這兩個統計子句做了比較嚴格的使用限制。數據庫管理員必須對這些使用閑置銘記在心,否則的話很容易在統計的過程中遇到錯誤。具體來說,有如下幾個使用限制。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
客戶需求分析:
筆者最近接到一家客戶的一個需求。他們部署了一個ERP系統,現在采用的就是Oracle數據庫。現在由于企業統計分析的需要,要實現如下的需求。
1、按月份來統計2009年第一季度每個供應商的采購金額。也就是說,在報表中要能夠顯示出2009年1月份、2月份、3月份供應商的采購金額合計,不需要明細。
2、顯示的結果按年度、月份、供應商名字進行排序。
綜合客戶的要求,也就是說要實現如上這張報表。
PL/SQL語句解析:
select extract(YEAR FROM t.dateordered) AS 年度,extract(MONTH FROM t.dateordered) as 月份,
p.name as 供應商名字,sum(t.linenetamt) 合計
from c_orderline2 t
left join c_bpartner p on p.c_bpartner_id=t.c_bpartner_id
group by extract(YEAR FROM t.dateordered),extract(MONTH FROM t.dateordered),p.name
having extract(YEAR FROM t.dateordered)=2009 and extract(MONTH FROM t.dateordered) in (1,2,3)
order by p.name;
通過以上語句就可以實現企業如上的需求。在這個需求中,筆者主要用過Group By語句與Having語句來實現。這兩個是Oralce數據庫中PL/SQL語言中兩個很重要的分組語句。利用這個兩個語句可以實現一些復雜的統計功能。對于Group By與Having語句的一些基本用法,筆者在這里不做過多描述。筆者這里想說的是,在使用這兩個語句進行數據統計時需要注意的地方。在Oracle數據庫系統中,對于這兩個統計子句做了比較嚴格的使用限制。數據庫管理員必須對這些使用閑置銘記在心,否則的話很容易在統計的過程中遇到錯誤。具體來說,有如下幾個使用限制。
1、如果選擇列表中包含有列、表達式或者分組函數,那么這些列或者表達式必須出現在Group By子句中,否則數據庫會提示相關的錯誤信息。分組函數不用出現在Group By子句中。如上面這個例子,由于在數據庫基礎表中存儲的是下訂單的日期,如2009年4月15日。也就是說,年月日是存儲在同一個字段中的。但是在統計的時候,需要統計2009年1月、2月、3月的供應商采購金額。為此此時筆者先利用Extract函數從一個日期數據中抽取具體的年、月信息。這個是Oracle數據庫中一個很有用的日期函數。要是沒有這個函數的話,筆者還需要通過字符串等處理函數來截取年月等信息。由于Extract是一個帶函數的表達式,為此其必須出現在Group By子句中。而且注意,筆者此時采用的是表達式本身,而不是其別名。也就是說,筆者沒有采用group by年度,月份等表達方法。也就是說,在Group By子句中,必須采用表達式的全稱,而不能夠采用其別名。否則的話,數據庫系統不會接受這個語句。數據庫系統之所有要進行類似的控制,其背后藏有比較深層次的原因。不過作為普通數據庫管理員來說,不怎么用了解數據庫設計背后的內容。只需要把這個規則記在心中即可。這個規則對于大部分數據庫管理員來說,可能會經常觸犯他。為此筆者再次強調一遍,選擇列表中如果包含有列、表達式時,這個列、表達式必須包含在Group By子句中。另外,如果采用了表達式的話,則數據庫管理員即使在選擇列表中采用了別名,但是在Group By子句中仍然必須采用表達式的完整表達方式,而不能夠采用別名。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:IT專家網