在常見的業(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;