<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    冷面閻羅

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

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

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

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

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

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

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

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

    評(píng)論

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

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

    # 大梅沙云頂天海會(huì)所  回復(fù)  更多評(píng)論   

    大梅沙云頂天海會(huì)所

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

    --有兩個(gè)辦法,可以不用去改java程序,而在SQL里進(jìn)行統(tǒng)一
    --一個(gè)是在使用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 --在外層對(duì)NULL進(jìn)行轉(zhuǎn)換
    (select sum(1) as a from tbl_test t where t.id<100) x

    --第二種辦法是直接在sum的參數(shù)里進(jìn)行處理:
    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)計(jì)條件放到sum的參數(shù)里,可以對(duì)NULL進(jìn)行轉(zhuǎn)換
    2008-07-13 00:08 | masuz

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

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

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

    如果sum的列為NULL,那就判斷一下再sum,應(yīng)該可以
    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)計(jì)0的處理[未登錄]  回復(fù)  更多評(píng)論   

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

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

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

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

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

    這樣就行了....
    2008-07-14 14:25 | yy
    主站蜘蛛池模板: 中文字幕免费在线看线人动作大片| 99久久免费精品高清特色大片| 亚洲综合色成在线播放| 国产无遮挡裸体免费视频在线观看 | 一级毛片aa高清免费观看| 国产亚洲精品a在线无码| 中字幕视频在线永久在线观看免费 | 91国内免费在线视频| 亚洲免费中文字幕| 亚洲日韩国产精品乱| 亚洲视频在线免费看| 成人免费观看男女羞羞视频| 亚洲日本在线观看| 国产zzjjzzjj视频全免费| 久久午夜夜伦鲁鲁片免费无码| 亚洲人成网站在线在线观看| 国产亚洲精品资源在线26u| 永久免费毛片手机版在线看| 国产成人精品一区二区三区免费| 亚洲一卡一卡二新区无人区 | 亚洲.国产.欧美一区二区三区| 国产亚洲大尺度无码无码专线| 成人特黄a级毛片免费视频| 岛国岛国免费V片在线观看 | 午夜在线a亚洲v天堂网2019| 亚洲人成无码网站| 四虎影在线永久免费观看| 日本h在线精品免费观看| 高清免费久久午夜精品| 成人区精品一区二区不卡亚洲| 亚洲国产精品无码专区影院| 好男人视频在线观看免费看片| 日本免费高清视频| 九九视频高清视频免费观看 | a毛片视频免费观看影院| 日本永久免费a∨在线视频| 亚洲精品久久无码| 亚洲国产日产无码精品| 亚洲人成电影福利在线播放| 亚洲午夜无码AV毛片久久| 国产网站免费观看|