sql 累計佔比 SQL語句 求總和的百分比

2021-10-13 08:53:52 字數 2696 閱讀 5071

問題:求特定列中的值佔總和的百分比。例如,確定所有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

) xwhere deptno=10

必須記住,視窗函式在where子句後執行。因此不能把針對deptno的篩選放在內聯檢視x中。分別考慮一下內聯檢視x中包含及不包含deptno篩選的結果。首先,看一下不包含deptno篩選的結果:

select deptno,

sum(sal)over() total,

sum(sal)over(partition by deptno) d10

from emp

dep10      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外面的原因。

sql 累計佔比 sql統計佔比和統計數量

在工作中經常遇到統計佔比的需求,有時候還要把沒有值得統計為0,如何寫sql呢?下面寫乙個小例子,作為參考,方便以後查閱.資料準備 create table t group id number not null,name varchar2 100 alter table t group add pri...

sql 累計佔比 MSSQL 讀寫佔比分析方法分享

為了精準分析當前系統的讀寫佔比,我們可以通過以下sql語句,獲取指定資料庫的db檔案的讀寫情況,通過這些情況,我們可以為系統提速做下一步的操作,例 如果讀多於寫,那麼需要做讀寫分離 如果寫非常多,那麼需要對業務場景的後台進行重新部署,分庫分表,等提速操作,以下指令碼將展示,監控mssql 檔案的讀寫...

sql 累計佔比 製作有累積和佔比的銷售統計表

現有這樣的產品月銷售明細表 希望按下面的樣子,按類別分組統計各產品銷售額,銷售額從高到低排序,並增加組內累積及佔比。資料檔案 產品銷售明細.xls 製作報表過程 1 開啟潤幹報表工具並新建空白報 2 設定報表的資料集為 excel 檔案 3 繪製報表,包括樣式 報表單元格的表示式等 其中表示式部分 ...