常見統(tǒng)計分析—按條件統(tǒng)計絕對數量及相對占比

在常見的業(yè)務場景中經常會遇到分類統(tǒng)計的問題,如下表所示學生分數,需求:

1.取得不同分數段學生的絕對數量(優(yōu)良中差數量)

2.取得不同分數段學生的相對情況(優(yōu)良中差占比)

表名:score

sid cid score

01  01  80

01  02  90

01  03  99

02  01  70

02  02  60

02  03  80

03  01  80

03  02  80

03  03  80

04  01  50

04  02  30

04  03  20

05  01  76

05  02  87

06  01  31

06  03  34

07  02  89

07  03  98

(1)考察點: case when 函數使用

select
    *,
    (
    case
        when score < 60 then 'fail' # 注意此處不需要加‘else’,推測‘else’應該是在最后一個條件前加,否則報錯
        when score >= 60 and score < 85 then 'pass' else # 此處需要加‘else’或者下面繼續(xù)用‘when...then'
        'good'
    end
    )as 'rank'
from
    score;

查詢結果如下:

sid cid score rank
01  01  80  pass
01  02  90  good
01  03  99  good
02  01  70  pass
02  02  60  pass
02  03  80  pass
03  01  80  pass
03  02  80  pass
03  03  80  pass
04  01  50  fail
04  02  30  fail
04  03  20  fail
05  01  76  pass
05  02  87  good
06  01  31  fail
06  03  34  fail
07  02  89  good
07  03  98  good

(2)考察點:復雜查詢—多表非連接查詢
簡單原表:

sid cid score
01  01  80
01  02  90
01  03  99
02  01  70
02  02  60

求各score占比:
a)該表中分數(score)各不相同,因此不需用到分組函數

SELECT
    a.score,
    concat( round( a.score / b.total * 100, 2 ), ' %' ) AS percent # 連接-四舍五入-計算占比
FROM
    ( SELECT * FROM score LIMIT 5 ) a, # a表為原始的待計算數據表
    ( SELECT sum( score ) total FROM ( SELECT * FROM score LIMIT 5 ) a ) b # b表為計算占比的總和參數
ORDER BY
    score DESC;
score percent
99  24.81 %
90  22.56 %
80  20.05 %
70  17.54 %
60  15.04 %

b)該表中分數(score)有相同,因此需用到分組求和函數

SELECT
    tt.rank,
    concat(round(tt.rank_num / b.total * 100,2),' %') as percent 
FROM
    (
SELECT
    t.rank,
    count( * ) rank_num 
FROM
    (
SELECT
    *,
    ( CASE WHEN score < 60 THEN 'fail' # 注意此處不需要加‘else’,推測‘else’應該是在最后一個條件前加,否則報錯
    WHEN score >= 60 AND score < 85 THEN 'pass' ELSE # 此處需要加‘else’或者下面繼續(xù)用‘when...then'
    'good' END ) AS 'rank' 
FROM
    score 
    ) t 
GROUP BY
    t.rank 
    ) tt,
    (
SELECT
    sum( rank_num ) total 
FROM
    (
SELECT
    t.rank,
    count( * ) rank_num 
FROM
    (
SELECT
    *,
    ( CASE WHEN score < 60 THEN 'fail' # 注意此處不需要加‘else’,推測‘else’應該是在最后一個條件前加,否則報錯
    WHEN score >= 60 AND score < 85 THEN 'pass' ELSE # 此處需要加‘else’或者下面繼續(xù)用‘when...then'
    'good' END ) AS 'rank' 
FROM
    score 
    ) t 
GROUP BY
    t.rank 
    ) tt 
    ) b;
rank percent
fail    27.78 %
good    27.78 %
pass    44.44 %

該方法可行,但過程繁瑣,調用了兩次原始表。
c)簡單方式

set @sum = (select sum(score) from score); # 定義一個參數即可
select score,concat(round(score / @sum * 100,2),'%') as percent from score;
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 網上流傳較廣的50道SQL訓練,奮斗了不知道多久終于寫完了。前18道題的難度依次遞增,從19題開始的后半部分算是循...
    Kaidi_G閱讀 481,997評論 312 453
  • 50個常用的sql語句Student(S#,Sname,Sage,Ssex) 學生表Course(C#,Cname...
    哈哈海閱讀 1,339評論 0 7
  • 說明:以下五十個語句都按照測試數據進行過測試,最好每次只單獨運行一個語句。 問題及描述: --1.學生表 Stud...
    lijun_m閱讀 1,404評論 0 1
  • Student(S#,Sname,Sage,Ssex) 學生表 Course(C#,Cname,T#) 課程表 S...
    忘了呼吸的那只貓閱讀 3,038評論 0 8
  • 有一種職業(yè),不是民警,卻要每天解決爭搶糾紛;有一種職業(yè),不是醫(yī)生,卻要了解各類疑難雜癥;有一種職業(yè),不是文秘,卻要...
    陳春燕8286閱讀 574評論 0 0

友情鏈接更多精彩內容