2016-09-25 7 views
0

私はテキストと呼ばれる列を持っていて、 "肯定"、 "否定的"、 "中立"の3つの値を持つ「カテゴリ」と呼ばれます。sqlの列の値の数のパーセンテージを計算する方法は?

カテゴリの各テキスト値の割合はどのようにして計算できますか? たとえば、3行、1行が正、1行が負、1行が中立である場合、33%の正の33%と中立の33%が生成されます。

これは私がするようになった段階...

SELECT COUNT(category), category FROM tweets GROUP BY category 

答えて

2

select category, count, count/total percent 
    from 
    (
    select category, count(category) count 
     from tweets 
    group by category 
) c JOIN (
    select count(*) total 
     from tweets 
) t 

に出力にそれを行うための一つの方法である:

 
+----------+-------+---------+ 
| category | count | percent | 
+----------+-------+---------+ 
| negative |  1 | 0.3333 | 
| neutral |  1 | 0.3333 | 
| positive |  1 | 0.3333 | 
+----------+-------+---------+ 

を...それは可能であろうか? oは0.3333ではなく33%だけを返しますか?

select category, count, round(count/total * 100) percent 
    from 
    (
    select category, count(category) count 
     from tweets 
    group by category 
) c JOIN (
    select count(*) total 
     from tweets 
) t 
 
+----------+-------+---------+ 
| category | count | percent | 
+----------+-------+---------+ 
| negative |  1 |  33 | 
| neutral |  1 |  33 | 
| positive |  1 |  33 | 
+----------+-------+---------+ 

あなたが%を追加したい場合は、concat(round(count/total * 100), '%')を行う使用することができますが、私は強くクライアントコードに(書式設定の任意の並べ替えを)それを実行することをお勧め。あなたの現在のクエリに

+0

回答ありがとうございました@peterm 0.3333ではなく33%しか返すことはできませんか? –

+0

これは素晴らしいですね。@peterm –

0

ほんの少しの修正:

select t.category, count(*)/t.total,  -- number 
     concat(100 * count(*)/t.total, '%') -- string 
from tweets t join 
    (select count(*) as total) t 
group by category; 

あなたがそこにいることを知っている場合は、次の注意点としては

SELECT COUNT(category)/COUNT(*), category FROM tweets GROUP BY category 
+0

'category(数値)/ COUNT(*)'は 'category'にヌルが含まれていないと仮定して常に' 1 'を返します。 – peterm

+0

Ack、そうです。 – kiastu

1

、私はこれは、より簡単に、単一のサブクエリを使用して書かれたくらいだと思います次の3つのカテゴリのみを1行に入れます:

select avg(category = 'positive') as p_positive, 
     avg(category = 'negative') as p_negative 
     avg(category = 'neutral') as p_neutral 
from tweets t; 

q ueryは、ブール式が数値コンテキスト内の整数として扱われるというMySQLの機能を使用します。真であれば "1"、偽であれば "0"を返します。

関連する問題