背景:最近在測試有關占比,有些算法使用笨辦法感覺很浪費時間,所以網上試着找了一個類似的函數來計算,提高效率。
前提描述:存在一張表:label_for_drug_insu_admdvs,其中drug_type為葯品分類:1,2,3,4分別代表西葯中成葯、中葯、自制葯、民族葯。drug_type為性別。
需要的結果:現在需要展示出各種性別類型的葯品分類金額及占比、總人數。其中每個性別的葯品占比=每個性別的葯品人數/所有性別總人數。具體實現效果見截圖

sql實現方法:
SELECT
gend,
drug_type,
drug_psn_cnt,
SUM (drug_psn_cnt) OVER ( partition by gend order by drug_type) as "按性別的葯品分類連續求和" ,--"按性別的葯品分類連續求和",
sum(drug_psn_cnt) over (partition by gend) as "性別統計總和",-- 性別統計總和,同一性別總和不變。
--各葯品占所在性別占比
round(drug_psn_cnt/round( sum(drug_psn_cnt) over (partition by gend),4)*100,4)||'%' "各個葯品分類占比",
SUM (drug_psn_cnt) OVER () as "所有性別人數總和", --"所有性別人數總和" ,
round(drug_psn_cnt/round(SUM(drug_psn_cnt)OVER(),4)*100,4)||'%' "總份額" --總份額
FROM
drug_gend
WHERE
drug_type IN ('1', '2', '3', '4')
and admdvs LIKE '44%'

總結:sum() over()函數 ,over()不能單獨使用,要和sum()一起使用。
over(partition by columnname1 order by columnname2)
含義,按columname1指定的字段進行分組排序,或者說按字段columnname1的值進行分組排序。
SUM (drug_psn_cnt) OVER ( partition by gend order by drug_type) as "按性別的葯品分類連續求和" ,--"按性別的葯品分類連續求和",
sum(drug_psn_cnt) over (partition by gend) as "性別統計總和",-- 性別統計總和,同一性別總和不變。
SUM (drug_psn_cnt) OVER () as "所有性別人數總和", --"所有性別人數總和" ,
round(drug_psn_cnt/round( sum(drug_psn_cnt) over (partition by gend),4)*100,4)||'%' "各個葯品分類占比",
SUM (drug_psn_cnt) OVER () as "所有性別人數總和", --"所有性別人數總和" ,
