在資料分析中常用工具如Excel 內有相當多好用的函數,如Countif、sumif....等。

而在強大的結構化資料庫如何透過SQL語法達到同等效果,詳見下方範例程式碼:

若無資料庫系統想進行以下測試,可參考後方連結之線上測試工具,可以簡單測試SQL語法,以達到SQL語法的練習效果(連結)。

 


範例資料結構語法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
CREATE TABLE IF NOT EXISTS `docs` (
  `ClassID` varchar(5)  NOT NULL,
  `Category` varchar(5)  NOT NULL,
  `StudentID` varchar(200)  NOT NULL,
  `Grade` int(5) unsigned NOT NULL
) ;

INSERT INTO `docs`
(`ClassID`, `Category`, `StudentID`,`Grade`) VALUES
  ('A', '國文', 'A001',86),
  ('A', '國文', 'A002',61),
  ('A', '國文', 'A002',61),
  ('A', '國文', 'A002',63),
  ('A', '國文', 'A002',44),  
  ('A', '數學', 'A001',89),
  ('A', '數學', 'A001',100),
  ('A', '英文', 'A001',99), 
  ('A', '英文', 'A001',71), 
  ('B', '英文', 'A001',71),
  ('B', '國文', 'A001',82);

 

範例資料查詢語法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
SELECT `Category`,
COUNT(CASE WHEN `Grade` > 80 THEN 1 END) as '(1)A級人數80+',
SUM(CASE WHEN `Grade` > 80 THEN 1 ELSE 0 END) as '(2)A級人數80+',
COUNT(CASE WHEN (`Grade` > 60 AND `Grade` < 80) THEN 1 END) as 'B級人數60~79',
COUNT(CASE WHEN (`Grade` > 0 AND `Grade` < 60) THEN 1 END) as 'C級人數0~59',

AVG(CASE WHEN `Grade` > 80  THEN `Grade` END) as 'A級平均分數',
AVG(CASE WHEN (`Grade` > 60 AND `Grade` < 80) THEN `Grade` END) as 'B級平均分數',
AVG(CASE WHEN (`Grade` > 0 AND `Grade` < 60) THEN `Grade` END) as 'C級平均分數'

FROM `docs`
WHERE `ClassID` = 'A'
Group by `Category` 

 

上述程式碼中,Line 3 與 Line 4 可以達到同樣的效果,在使用經驗上,Line 3 效能為優於 Line 4(實際可能仍需根據實測結果為主)。

特定資料庫語法可能有更優化之寫法,以上範例僅供參考使用。

 

 

 

arrow
arrow
    文章標籤
    sql
    全站熱搜
    創作者介紹
    創作者 Lung-Yu,Tsai 的頭像
    Lung-Yu,Tsai

    Lung-Yu,Tsai 的部落格

    Lung-Yu,Tsai 發表在 痞客邦 留言(0) 人氣()