2012-07-07 15 views
14

私は多少このようになりますテーブルがあります。各idのための今すぐSQL - 特定の値を持つカウント行

id value 
1 0 
1 1 
1 2 
1 0 
1 1 
2 2 
2 1 
2 1 
2 0 
3 0 
3 2 
3 0 

を、私は0と1の出現箇所の数とのための出現箇所の数をカウントしたいです

id n0 n1 total 
1 2 2 5 
2 1 2 4 
3 2 0 3 

が、私はこの文で最初と最後の行を取得するために管理:最終的な結果は次のようになりますので、そのID、(値は任意の整数とすることができます)

しかし、私はここから一種の迷子です。巨大な声明なしでこれを達成する方法に関するあらゆる指針? MySQLで

答えて

26

、あなたはSUM(condition)を使用することができます。

SELECT id, SUM(value=0) AS n0, SUM(value=1) AS n1, COUNT(*) AS total 
FROM  mytable 
GROUP BY id 

sqlfiddleでそれを参照してください。

+1

甘い、私は「SUM(条件)」があることを知りませんでした! – ryyst

+2

@ryyst:MySQLは、条件式のブール結果を、偽ならば0、真ならば1に評価するという事実を利用するトリックです。各グループに渡って「SUM」を取ると、条件が真であるレコードの数が得られます。 – eggyal

+7

また、他のすべての主要なDBMSで動作する、より表現力豊かで、 'COUNT(CASE WHEN value = 0 THEN 1 END)AS n0、...、...'を使用することもできます。ブール変換。詳細については、私の[ここでの質問](http://stackoverflow.com/questions/11340540/conditional-counting-performance-differences-in-using-sum-vs-count)を参照してください。 –

0

@Zaneが上でコメントしたように、典型的な方法はCASE式を使用してピボットを実行することです。

SQL Serverには、表示される可能性のあるPIVOT演算子が追加されました。 DECODE()とIIF()は、OracleとAccessの古いアプローチであり、あなたがまだ見つかっているかもしれません。

関連する問題