2017-03-07 4 views
0

を使用して平均的な割合の計算私はmysqlの和と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 

マイクエリーれを用いて、以下に示すように、のような出力を育てるための要件を持って

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 

下に与えるように私はStatisticsテーブルを持っています私が書いたのは以下の通りです

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 

しかし、私は渡された平均のEAD、つまりは私が20%、40%30%を得れば、私は30%として平均を取得する必要がありますと言うが、私の上記のクエリのために、私は90%を取得しています。 、AVGを計算するには値を「合格」している行数を知る最初の必要性を

:また

誰でもサブクエリを使用して、この

+0

どのフィールドタイプが値ですか? – McNets

+0

@McNetsの 'varchar' –

+0

@McNetsはいu r右.... 30% –

答えて

1

あなたはaverageためAVGの集計関数を使用する必要があります。

変更

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のオペランドと共に使用される場合

を除去しますオペランドに互換性を持たせるために型変換が行われます。一部の変換は暗黙的に行われます。例えば、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'部分で 'zero'の代わりに' NULL'を使います。更新された回答を参照してください。 –

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