冷面閻羅

          低調做人&&高調做事
          隨筆 - 208, 文章 - 3, 評論 - 593, 引用 - 0
          數(shù)據(jù)加載中……

          ORACLE數(shù)據(jù)統(tǒng)計0的處理

                    大概是前一周去見客戶,他要弄了年終統(tǒng)計報表,從系統(tǒng)中所有臺帳的基礎數(shù)據(jù)去統(tǒng)計總算、容量等數(shù)據(jù)。
                   拿到統(tǒng)計模板一看,傻眼了需要統(tǒng)計近百項,而且每一項都需要單獨使用SQL去查詢。
                   起初  為了方便查詢數(shù)據(jù),中間視圖套用視圖,結果發(fā)現(xiàn)我嵌套了3層視圖,效率實在不敢恭維。
                   后來 為了提高效率,就把中間的視圖去掉,改為從表查詢數(shù)據(jù),結果每個項需要查詢3~4表,效率比第一次提升不少。其實查詢這種統(tǒng)計數(shù)據(jù),千萬不能視圖套用視圖,那效率就沒的說了。

                  程序實現(xiàn),發(fā)現(xiàn)使用count(*)統(tǒng)計總數(shù)的時候,如沒有則顯示0;使用sum()統(tǒng)計,則沒有不顯示,這樣我前臺頁面上有的沒有數(shù)據(jù)顯示0,有的沒有數(shù)據(jù)不顯示,不統(tǒng)一也不美觀。
             
                 改造1,在查詢數(shù)據(jù)的java端操作,不是我不想在 我的視圖中修改,我先后試驗過decode、nvl、case甚至使用if then else 語句,都沒有把這個討厭的0去掉,沒有部分只好在java端進行for循環(huán)了,這樣效率也不怎么樣,白白多了2層循環(huán),鑒于視圖寫的比較合理,這樣的速度客戶居然能接受。

                晚上睡覺就想,怎么才能把0去掉了,基本上把oracle的函數(shù)都想一遍了,甚至想自己寫的函數(shù)實現(xiàn),后來想到replace函數(shù),結果使用成功了。

               但是發(fā)現(xiàn)使用replace的效率好像沒有使用改造1的方案快?

              不知各位還有沒有別的方法處理0這個問題,歡迎大家討論一下。

          posted on 2008-07-11 16:12 冷面閻羅 閱讀(5471) 評論(8)  編輯  收藏 所屬分類: 數(shù)據(jù)庫

          評論

          # re: ORACLE數(shù)據(jù)統(tǒng)計0的處理  回復  更多評論   

          呵呵不是方法的方法,但能解決問題。vista的源碼中說不定也有這樣曲線救國的代碼呢
          :)
          2008-07-11 17:09 | hnwyf

          # 大梅沙云頂天海會所  回復  更多評論   

          大梅沙云頂天海會所
          2008-07-11 17:47 | 大梅沙云頂天海會所

          # re: ORACLE數(shù)據(jù)統(tǒng)計0的處理  回復  更多評論   

          --有兩個辦法,可以不用去改java程序,而在SQL里進行統(tǒng)一
          --一個是在使用sum的查詢外面再嵌套一層:
          select sum(1) as a from tbl_test t where t.id<100
          -->
          select (case when x.a is null then 0 end) as a from --在外層對NULL進行轉換
          (select sum(1) as a from tbl_test t where t.id<100) x

          --第二種辦法是直接在sum的參數(shù)里進行處理:
          select sum(1) as a from tbl_test t where t.id<100
          -->
          select sum(case when t.id<100 then 1 else 0 end) as a from tbl_test t
          --把統(tǒng)計條件放到sum的參數(shù)里,可以對NULL進行轉換
          2008-07-13 00:08 | masuz

          # re: ORACLE數(shù)據(jù)統(tǒng)計0的處理  回復  更多評論   

          @masuz
          sum函數(shù)如果求和的列沒有數(shù)據(jù),即為null的時候,sum后的結果為null,
          但是count函數(shù),統(tǒng)計的函數(shù)是從0開始的。
          2008-07-13 08:11 | 冷面閻羅

          # re: ORACLE數(shù)據(jù)統(tǒng)計0的處理  回復  更多評論   

          如果sum的列為NULL,那就判斷一下再sum,應該可以
          select sum(case when t.num is null then 0 else t.num end) as a from tbl_test t
          2008-07-13 14:36 | masuz

          # re: ORACLE數(shù)據(jù)統(tǒng)計0的處理[未登錄]  回復  更多評論   

          使用nvl
          2008-07-14 12:27 | Jarod

          # re: ORACLE數(shù)據(jù)統(tǒng)計0的處理[未登錄]  回復  更多評論   

          在項目實施過程中也遇到一個類似的問題。
          要統(tǒng)計數(shù)據(jù),但是表中間一條數(shù)據(jù)都沒有,結果用SUM出來什么都沒有,客戶希望出來的是0.
          結果就先用count(*)判斷是不是有記錄,沒有直接返回0,有再進行SUM操作。SUM操作的時候將NULL的變成0,這樣進行統(tǒng)計,結果始出來的。不過用count函數(shù),還必須有個GROUP BY的操作,變態(tài)啊……
          2008-07-14 12:36 | James

          # re: ORACLE數(shù)據(jù)統(tǒng)計0的處理[未登錄]  回復  更多評論   

          select nvl(sum(x),0) from xxx

          這樣就行了....
          2008-07-14 14:25 | yy
          主站蜘蛛池模板: 临夏市| 江川县| 宜兰县| 射洪县| 和龙市| 水富县| 长海县| 河南省| 陆丰市| 米林县| 荃湾区| 宕昌县| 石泉县| 类乌齐县| 承德县| 新营市| 筠连县| 嵊州市| 靖宇县| 乌拉特中旗| 龙江县| 元阳县| 当涂县| 红桥区| 仙桃市| 阿勒泰市| 巨野县| 新营市| 姜堰市| 年辖:市辖区| 民县| 五家渠市| 淳安县| 汤阴县| 汨罗市| 太康县| 贺州市| 泸溪县| 南岸区| 荆门市| 章丘市|