<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
    主站蜘蛛池模板: 亚洲成人免费在线| 中文在线免费视频| 成年男女免费视频网站| 亚洲成无码人在线观看| 99久久人妻精品免费二区| 亚洲第一中文字幕| 在线看无码的免费网站| 亚洲三级视频在线| 免费看的一级毛片| 特a级免费高清黄色片| 曰韩亚洲av人人夜夜澡人人爽| 国产免费一级高清淫曰本片| 日韩亚洲一区二区三区| 91精品国产免费入口| 亚洲av无码国产综合专区| 女人18特级一级毛片免费视频| 中文字幕精品三区无码亚洲 | 日本特黄特色AAA大片免费| 又粗又大又猛又爽免费视频| xxxxxx日本处大片免费看 | 亚洲视频在线免费看| 97在线线免费观看视频在线观看| 久久狠狠爱亚洲综合影院| 最好免费观看韩国+日本| 特级毛片爽www免费版| 亚洲高清在线视频| 大香人蕉免费视频75| 黄色片网站在线免费观看| 久久亚洲伊人中字综合精品| 亚洲精品免费在线| 免费人成大片在线观看播放| 亚洲av日韩av无码| 国产精品免费视频一区| 西西人体免费视频| 中文无码亚洲精品字幕| 亚洲无码黄色网址| aa级一级天堂片免费观看| 特级做A爰片毛片免费看无码 | 国产午夜无码精品免费看动漫| 亚洲一区二区三区精品视频| 亚洲男人天堂2020|