2013-04-04 9 views
28

私は以下のdbテーブルを持っています。セールス・パーソンごとの特定の製品の売上のインスタンスを数えたいと思っています。特定の値のMySQLカウント・コラム

|------------|------------|------------| 
|id   |user_id  |product_id | 
|------------|------------|------------| 
|1   |1   |2   | 
|2   |1   |4   | 
|3   |1   |2   | 
|4   |2   |1   | 
|------------|------------|------------| 

次のような結果セットを作成したいと思います。

|------------|-------------|------------|------------|------------| 
|user_id  |prod_1_count |prod_2_count|prod_3_count|prod_4_count| 
|------------|-------------|------------|------------|------------| 
|1   |0   |2   |0   |1   | 
|2   |1   |0   |0   |0   | 
|------------|-------------|------------|------------|------------| 

このデータでグラフを作成していますが、もう一度(今日のように)私は列の合計を数えられません。私が試してみました;

SELECT user_id, 
(SELECT count(product_id) FROM sales WHERE product_id = 1) AS prod_1_count, 
(SELECT count(product_id) FROM sales WHERE product_id = 2) AS prod_2_count, 
(SELECT count(product_id) FROM sales WHERE product_id = 3) AS prod_3_count, 
(SELECT count(product_id) FROM sales WHERE product_id = 4) AS prod_4_count 
FROM sales GROUP BY user_id; 

これが動作しない理由を括弧各SELECTのためのuser_idがメインSELECT文で外部のuser_idと一致していないので、私は、見ることができます。

誰でも私をここで助けることができますか?これが動作するかどうか、あなたが

答えて

62

あなたはSUMCASEを使用してこれを行うことができます:あなたはピボットデータにしようとしている

select user_id, 
    sum(case when product_id = 1 then 1 else 0 end) as prod_1_count, 
    sum(case when product_id = 2 then 1 else 0 end) as prod_2_count, 
    sum(case when product_id = 3 then 1 else 0 end) as prod_3_count, 
    sum(case when product_id = 4 then 1 else 0 end) as prod_4_count 
from your_table 
group by user_id 
+0

アイケーありがとうございました。これはすべてのソリューションの中で最速でした。ありがとうございました:) –

+2

'sum(product_id = 1)'はできませんか? 'product_id = 1'はブール式です。スイッチケースなしで自然に1または0を返します。 – mpen

+1

@マークはうまくいくでしょうし、名目上高速かもしれませんが、わかりやすく書かれた解決策を見つけることができます。 –

1

を参照してください

感謝:

SELECT a.user_id, 
(SELECT count(b.product_id) FROM sales b WHERE b.product_id = 1 AND a.user_id = b.user_id) AS prod_1_count, 
(SELECT count(b.product_id) FROM sales b WHERE b.product_id = 2 AND a.user_id = b.user_id) AS prod_2_count, 
(SELECT count(b.product_id) FROM sales b WHERE b.product_id = 3 AND a.user_id = b.user_id) AS prod_3_count, 
(SELECT count(b.product_id) FROM sales b WHERE b.product_id = 4 AND a.user_id = b.user_id) AS prod_4_count 
FROM sales a GROUP BY a.user_id; 

乾杯。 n.b.同等の結果を達成するには若干良い方法があるかもしれません。

+2

感謝を参照してください、このソリューションは、仕事をしたが、それは数秒を要しました。アイケの解決策は非常に速かったのですが、とにかくあなたの答えに感謝しています。 –

14

。あなたはCASE式に集約関数を使用する必要がありますので、MySQLがピボット機能を持っていません。

select user_id, 
    count(case when product_id = 1 then product_id end) as prod_1_count, 
    count(case when product_id = 2 then product_id end) as prod_2_count, 
    count(case when product_id = 3 then product_id end) as prod_3_count, 
    count(case when product_id = 4 then product_id end) as prod_4_count 
from sales 
group by user_id; 

SQL Fiddle with Demo

+1

私はこの1000の上向きの矢印を与えることができたらいいと思う。ピボットするだけでクリック。 – ghukill

関連する問題