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

2021-10-13 08:53:52 字數 2668 閱讀 1505

在工作中經常遇到統計佔比的需求,有時候還要把沒有值得統計為0,如何寫sql呢?

下面寫乙個小例子,作為參考,方便以後查閱.

資料準備:

create table t_group( id number not null, name varchar2(100));

alter table t_group add primary key (id);

create table t_score( id number not null, g_id number not null, score number);

alter table t_score add primary key (id);

insert into t_group (id, name) values ('1', 'a');

insert into t_group (id, name) values ('2', 'b');

insert into t_group (id, name) values ('3', 'c');

insert into t_group (id, name) values ('4', 'd');

insert into t_group (id, name) values ('5', 'e');

commit;

insert into t_score (id,g_id, score) values ('1','1', '81');

insert into t_score (id,g_id, score) values ('2','1', '73');

insert into t_score (id,g_id, score) values ('3','2', '78');

insert into t_score (id,g_id, score) values ('4','3', '92');

commit;

/* 需求1.求每個gropu的得分在總得分中的佔比 */

select tg.name,

sum(ts1.score) / (select sum(ts.score) from t_score ts) * 100 as perc

from t_score ts1 join t_group tg on ts1.g_id = tg.id

group by tg.name

/* 需求2.統計所有group在總得分中的佔比,要求得分為0的資料也統計到結果中,顯示為數值0 */

--思路一:用case when 轉換結果.

--最先想到的是直接在join上做文章,用right join,但這個顯示的結果中佔比為空而不是數值0

select name,

(case

when perc is null then

else

perc

end) as perc

from (select tg.name,

sum(ts1.score) / (select sum(ts.score) from t_score ts) * 100 as perc

from t_score ts1

right join t_group tg

on ts1.g_id = tg.id

group by tg.name)

order by name;

--思路二: 使用union all + 0 補充缺位 + group by

select tg1.name, sum(tt.perc)

from (select ts1.g_id,

sum(ts1.score) / (select sum(ts.score) from t_score ts) * 100 as perc

from t_score ts1

group by g_id

union all

select tg.id as g_id, 0 as perc from t_group tg) tt

join t_group tg1

on tt.g_id = tg1.id

group by tg1.name

order by tg1.name;

/* 需求3.按得分統計出 優良中差等級的分別有多少條資料,沒有資料的等級顯示為0 */

select tt.lev, sum(tt.cou)

from (select lev, count(lev) cou

from (select (case

when score >= 90 then

'優'when score >= 80 then

'良'when score >= 70 then

'中'else

'差'end) as lev

from t_score) t

group by lev

union all (select '優' as lev, 0 as cou

from dual

union all

select '良' as lev, 0 as cou

from dual

union all

select '中' as lev, 0 as cou

from dual

union all

select '差' as lev, 0 as cou from dual)) tt

group by tt.lev;

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

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

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

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

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

問題 求特定列中的值佔總和的百分比。例如,確定所有deptno 10工資佔總工資的百分比 deptno 10的工資在總工資中的百分比數 解決方案 總的來說,在sql中計算佔總數的百分比跟書面計算一樣 先除後乘。這個例子要計算表emp中deptno 10工資所佔的百分比。首先,算出deptno 10的...