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

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

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

    紙飛機

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      22 隨筆 :: 28 文章 :: 30 評論 :: 0 Trackbacks

    問題:求特定列中的值占總和的百分比。例如,確定所有DEPTNO 10工資占總工資的百分比(DEPTNO 10的工資在總工資中的百分比數(shù))。

    解決方案

    總的來說,在SQL中計算占總數(shù)的百分比跟書面計算一樣:先除后乘。這個例子要計算表EMP中DEPTNO 10工資所占的百分比。首先,算出DEPTNO 10的工資,然后除以表中的工資總和,最后一步,乘以100,則返回一個表示百分比的值。

    MySQL和PostgreSQL

    DEPTNO 10的工資總和除以所有工資總和:

    1 select (sum(

    2           case when deptno = 10 then sal end)/sum(sal)

    3          )*100 as pct

    4    from emp

    DB2、Oracle和SQL Server

    使用內(nèi)聯(lián)視圖及窗口函數(shù)SUM OVER,計算出所有工資總和以及DEPTNO 10的工資和。然后,在外層查詢中進行除法和乘法操作:

    1   select distinct (d10/total)*100 as pct

    2     from (

    3   select deptno,

    4          sum(sal)over() total,

    5          sum(sal)over(partition by deptno) d10

    6     from emp

    7          ) x

    8    where deptno=10

    討論

    MySQL和PostgreSQL

    用CASE語句能夠輕松地得到DEPTNO 10的工資。然后將它們加起來,并除以所有工資總和。由于聚集時會忽略NULL值,所以CASE語句中不必加入ELSE子句。如果想看到確切的被除數(shù)和除數(shù),則可以執(zhí)行不做除法的查詢:

    select sum(case when deptno = 10 then sal end) as d10,

            sum(sal)

       from emp

    D10   SUM(SAL)

    ---- ---------

    8750               29025

    依定義SAL的方式不同,在進行除法操作時可能需要做顯式類型轉(zhuǎn)換。例如,在DB2、SQL Server和PostgreSQL中,如果SAL定義為整數(shù),則可以把它轉(zhuǎn)換為小數(shù),以便得到正確答案,如下所示:

    select (cast(

              sum(case when deptno = 10 then sal end)

                  as decimal)/sum(sal)

             )*100 as pct

       from emp

    DB2、Oracle和SQL Server

    除傳統(tǒng)解決方案外,該方案使用窗口函數(shù)計算相對于總數(shù)的百分數(shù)。對于DB2和SQL Server,如果SAL定義為整數(shù)類型,則在除法操作之前,需要進行類型轉(zhuǎn)換:

    select distinct

            cast(d10 as decimal)/total*100 as pct

       from (

    select deptno,

            sum(sal)over() total,

            sum(sal)over(partition by deptno) d10

       from emp

            ) x

    where deptno=10

    必須記住,窗口函數(shù)在WHERE子句后執(zhí)行。因此不能把針對DEPTNO的篩選放在內(nèi)聯(lián)視圖X中。分別考慮一下內(nèi)聯(lián)視圖X中包含及不包含DEPTNO篩選的結(jié)果。首先,看一下不包含DEPTNO篩選的結(jié)果:

    select deptno,

            sum(sal)over() total,

            sum(sal)over(partition by deptno) d10

       from emp

    DEP

    ------- --------- ---------

          10      29025       8750

          10      29025       8750

          10      29025       8750

          20      29025      10875

          20      29025      10875

          20      29025      10875

          20      29025      10875

          20      29025      10875

          30      29025       9400

          30      29025       9400

          30      29025       9400

          30      29025       9400

          30      29025       9400

          30      29025       9400

    包含DEPTNO篩選的結(jié)果:

    select deptno,

            sum(sal)over() total,

            sum(sal)over(partition by deptno) d10

       from emp

    where deptno=10

    DEPTNO      TOTAL        D10

    ------ --------- ---------

         10       8750       8750

         10       8750       8750

         10       8750       8750

    由于窗口函數(shù)在WHERE子句后執(zhí)行,因此TOTAL的值僅表示DEPTNO 10的工資之和,而實際上需要用TOTAL表示所有工資的總和。這就是必須把針對DEPTNO的篩選放在內(nèi)聯(lián)視圖X外面的原因。

    posted on 2008-05-14 21:46 紙飛機 閱讀(9775) 評論(0)  編輯  收藏 所屬分類: Database
    主站蜘蛛池模板: 免费精品无码AV片在线观看| 久久精品免费观看国产| 亚洲午夜精品一级在线播放放| 九九久久精品国产免费看小说| 亚洲∧v久久久无码精品| 国产乱码免费卡1卡二卡3卡| 午夜亚洲乱码伦小说区69堂| 亚洲av无码专区在线播放| 成全高清视频免费观看| 国产精品高清免费网站| 亚洲一级毛片免费看| 亚洲国产成人久久精品99| 一区二区三区四区免费视频| 亚洲欧美日韩中文二区| 亚洲成色www久久网站夜月| 成年人在线免费看视频| 老司机69精品成免费视频| 亚洲欧美日韩中文二区| 亚洲邪恶天堂影院在线观看| 在线A级毛片无码免费真人 | 中国一级特黄的片子免费| 久久精品国产亚洲AV忘忧草18| 久久久久国产成人精品亚洲午夜 | 亚洲啪啪免费视频| 国产综合亚洲专区在线| 免费电视剧在线观看| 七色永久性tv网站免费看| 精品亚洲成A人在线观看青青| 亚洲av激情无码专区在线播放| 国产男女性潮高清免费网站 | 国产国产成年年人免费看片| 99蜜桃在线观看免费视频网站| 香港特级三A毛片免费观看| 国产成人精品日本亚洲11| 久久久久亚洲AV片无码| 亚洲男人在线无码视频| 国产精品国产午夜免费福利看| 足恋玩丝袜脚视频免费网站| a在线视频免费观看| 午夜不卡AV免费| 国产精品亚洲色图|