冷面閻羅

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

          ORACLE數據統計0的處理

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

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

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

               但是發現使用replace的效率好像沒有使用改造1的方案快?

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

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

          評論

          # re: ORACLE數據統計0的處理  回復  更多評論   

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

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

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

          # re: ORACLE數據統計0的處理  回復  更多評論   

          --有兩個辦法,可以不用去改java程序,而在SQL里進行統一
          --一個是在使用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的參數里進行處理:
          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
          --把統計條件放到sum的參數里,可以對NULL進行轉換
          2008-07-13 00:08 | masuz

          # re: ORACLE數據統計0的處理  回復  更多評論   

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

          # re: ORACLE數據統計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數據統計0的處理[未登錄]  回復  更多評論   

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

          # re: ORACLE數據統計0的處理[未登錄]  回復  更多評論   

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

          # re: ORACLE數據統計0的處理[未登錄]  回復  更多評論   

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

          這樣就行了....
          2008-07-14 14:25 | yy
          主站蜘蛛池模板: 同江市| 扶绥县| 门源| 龙口市| 四平市| 大安市| 福鼎市| 清丰县| 江陵县| 英德市| 宁陵县| 平江县| 嘉鱼县| 安仁县| 扎兰屯市| 高阳县| 文安县| 峨眉山市| 许昌市| 阿瓦提县| 宜章县| 韩城市| 胶南市| 邯郸市| 黄冈市| 石楼县| 莒南县| 弥渡县| 家居| 逊克县| 南昌县| 龙川县| 隆昌县| 吉水县| 宁陵县| 龙南县| 方正县| 河津市| 绥中县| 金门县| 阳城县|