2017-03-07 20 views
0

我有一個Statistics表作爲在下面點心和使用MySQL

parent  key  value date 
MASTER  maths 400  2016-10-12 
MASTER  maths 200  2016-10-20 
MASTER  maths 350  2016-10-23 
MASTER  passed 20%  2016-10-25 
MASTER  passed 40%  2016-10-27 
MASTER  passed 30%  2016-10-28 
MASTER  maths 500  2016-11-12 
MASTER  maths 250  2016-11-20 
MASTER  maths 600  2016-11-23 
MASTER  passed 55%  2016-11-25 
MASTER  passed 75%  2016-11-27 
MASTER  maths 500  2016-12-12 
MASTER  maths 250  2016-12-20 
MASTER  maths 600  2016-12-23 
MASTER  passed 70%  2016-12-25 
MASTER  passed 65%  2016-12-26 
MASTER  passed 45%  2016-12-27 
MASTER  maths 500  2017-01-12 
MASTER  maths 450  2017-01-20 
MASTER  maths 770  2017-01-23 
MASTER  passed 87%  2017-01-25 
MASTER  passed 54%  2017-01-27 
MASTER  maths 900  2017-02-12 
MASTER  maths 250  2017-02-20 
MASTER  maths 500  2017-02-23 
MASTER  passed 67%  2017-02-25 
MASTER  passed 45%  2017-02-27 

我有一個要求,帶來了一個輸出一樣如下圖所示用mysql

maths passed date 
950 30%  2016-10 
1350 65%  2016-11 
1350 60%  2016-12 
1720 70.5% 2017-01 
1650 56%  2017-02 

我的查詢平均百分比計算,其我寫下面給出了

SELECT SUM(CASE WHEN key = 'maths' THEN value ELSE 0 END) AS maths, 
     SUM(CASE WHEN key = 'passed' THEN value ELSE 0 END) AS passed 
FROM Statistics 
WHERE parent = 'MASTER' GROUP BY MONTH(date) ORDER BY date ASC 

但我是通過inst平均的EAD,即可以說,如果我得到20%,40%和%那麼我應該得到的平均值作爲30%但我上面的查詢我得到90%。另外,也消失在結果

任何人都可以請幫我在這

+0

什麼字段類型是值? – McNets

+0

@McNets它的'varchar' –

+0

@McNets是的,你是對的.... 30% –

回答

1

你必須使用AVG聚合功能average

變化

SUM(CASE WHEN key = 'passed' THEN value ELSE 0 END) AS passed 

TO

AVG(CASE WHEN key = 'passed' THEN value ELSE 0 END) AS passed 

%符號被去除

當操作者使用具有不同的TY操作數pes,發生類型轉換以使操作數兼容。一些轉換隱式發生。例如,MySQL會根據需要自動將數字轉換爲字符串,反之亦然。

要顯示%符號,您可以聯繫結果。
以下更改查詢,可能會幫助您獲得所需的結果。

mysql> SELECT DATE_FORMAT(`date`, '%Y-%m') AS `month` 
    ->  , SUM(CASE `key` WHEN 'maths' THEN `value` ELSE NULL END) AS `maths` 
    ->  -- , SUM(CASE `key` WHEN 'passed' THEN `value` ELSE NULL END) AS `passed` 
    ->  , CONCAT(ROUND(AVG(CASE `key` WHEN 'passed' THEN `value` ELSE NULL END), 2), '%') AS `passedAvg` 
    -> FROM Statistics 
    -> WHERE parent = 'MASTER' 
    -> GROUP BY MONTH(`date`) 
    -> ORDER BY `date` ASC; 

結果可以是這樣的:

+---------+-------+-----------+ 
| month | maths | passedAvg | 
+---------+-------+-----------+ 
| 2016-10 | 950 | 30.00% | 
| 2016-11 | 1350 | 65.00% | 
| 2016-12 | 1350 | 60.00% | 
| 2017-01 | 1720 | 70.50% | 
| 2017-02 | 1650 | 56.00% | 
+---------+-------+-----------+ 

文檔參考

  • Type Conversion in Expression Evaluation
    • 當操作者使用具有不同類型的操作數發生類型轉換以使操作數兼容。一些轉換隱式發生。例如,MySQL根據需要自動將數字轉換爲字符串,反之亦然
+0

感謝您的回覆,但通過的百分比看起來不對 –

+0

在'case'子句的'else'部分,使用NULL而不是'zero' 。查看更新後的答案。 –

1

使用子查詢:

中計算平均,首先需要知道多少行有「通過」值。

(檢查它here

select yr as `year`, mt as `month`, 
     sum(val_maths) as `math`, 
     concat(cast((sum(val_passed)/sum(count_passed)) as char(50)), '%') as `passed` 
from (
     select ky, year(dt) as yr, month(dt) as mt, 
       if (ky = 'maths', replace(val,'%',''), 0) val_maths, 
       if (ky = 'passed', replace(val,'%',''), 0) val_passed, 
       if (ky = 'passed', 1, 0) as count_passed  
     from foot 
    ) tv 
group by yr, mt 
; 

| year | month | maths | passed | 
|-------|-------|--------|--------| 
| 2016 | 10 | 950 | 30% | 
| 2016 | 11 | 1350 | 65% | 
| 2016 | 12 | 1350 | 60% | 
| 2017 | 1  | 1720 | 70.5% | 
| 2017 | 2  | 1650 | 56% | 
+0

這就像Bodysnatchers入侵的最後一幕 – Strawberry

+0

@Strawberry你見過原始的嗎? – McNets

+0

只有薩瑟蘭。 – Strawberry