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

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

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

    紙飛機

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

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

    解決方案

    總的來說,在SQL中計算占總數的百分比跟書面計算一樣:先除后乘。這個例子要計算表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

    使用內聯視圖及窗口函數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子句。如果想看到確切的被除數和除數,則可以執行不做除法的查詢:

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

            sum(sal)

       from emp

    D10   SUM(SAL)

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

    8750               29025

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

    select (cast(

              sum(case when deptno = 10 then sal end)

                  as decimal)/sum(sal)

             )*100 as pct

       from emp

    DB2、Oracle和SQL Server

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

    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

    必須記住,窗口函數在WHERE子句后執行。因此不能把針對DEPTNO的篩選放在內聯視圖X中。分別考慮一下內聯視圖X中包含及不包含DEPTNO篩選的結果。首先,看一下不包含DEPTNO篩選的結果:

    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篩選的結果:

    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

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

    posted on 2008-05-14 21:46 紙飛機 閱讀(9766) 評論(0)  編輯  收藏 所屬分類: Database
    主站蜘蛛池模板: 亚洲中文字幕久久精品无码A| 国产免费久久精品| 亚洲av丰满熟妇在线播放| 中文字幕成人免费高清在线| 亚洲精品97久久中文字幕无码| 国产亚洲综合久久| 亚洲国产激情一区二区三区| 一级毛片完整版免费播放一区| 国产成人高清亚洲| 国产日韩AV免费无码一区二区| 黑人精品videos亚洲人| 亚洲视频免费在线观看| 亚洲欧洲视频在线观看| 免费黄网在线观看| 黄色一级毛片免费看| 亚洲熟妇av一区二区三区 | 8x8x华人永久免费视频| 久久久久精品国产亚洲AV无码| 天天干在线免费视频| 男女猛烈无遮掩视频免费软件| 亚洲精品乱码久久久久久按摩 | 国产一区二区三区亚洲综合| 亚洲精品视频在线看| 久久99热精品免费观看牛牛| 亚洲国产综合在线| 国产aa免费视频| 日批视频网址免费观看| 亚洲午夜久久久精品电影院| 精品国产免费观看久久久| 一区二区三区免费精品视频| 亚洲精品国产成人专区| 女人被弄到高潮的免费视频| 国产福利在线观看永久免费| 久久久久亚洲精品无码蜜桃 | A在线观看免费网站大全| 高h视频在线免费观看| 亚洲一区二区三区四区在线观看| 好吊妞在线成人免费| 9久热这里只有精品免费| 国产成人亚洲精品| 中文字幕亚洲无线码a|