在工作中經常遇到統計佔比的需求,有時候還要把沒有值得統計為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的...