2016-07-19 26 views
1

trasposeテーブルMySQLの私は、次の構造を持つMySQLのテーブルを持っている

|user_id|action_type|action_value|timestamp | 
|-------|-----------|------------|----------| 
|123 |click  |search  |20-07-2016| 
|231 |click  |search  |20-07-2016| 
|123 |click  |delete  |20-07-2016| 
事は、複数の値を取ることができACTION_TYPEが、彼らはので、私は内部の値としてそれらを置くことにしたテーブルの列であってもよいが動的である可能性がある

action_valueはaction_typeをとることができる値です。これは、ユーザーごとのアクション/日あたりで、与えられたACTION_TYPEため、次の

|action_type|timestamp |search|delete| 
|-----------|----------|------|------| 
|click  |20-07-2016|2  |1  | 
|-----------|----------|------|------| 

を返すクエリを作成することが可能である場合、私は思っていた、タイムスタンプによってその行動やグループ、それを実行するすべてのユーザーを返します。

は、私は次のクエリを試してみましたが、私は両方の列に同じ番号を取得しています

SELECT T1.action_type, DATE(T1.timestamp), count(T1.action_value) 'search', count(T2.action_value) 'delete' FROM cohort_actions T1 INNER JOIN (SELECT timestamp, action_value FROM cohort_actions WHERE action_value = 'delete') T2 ON DATE(T1.timestamp) = DATE(T2.timestamp) WHERE T1.action_type = 'click' AND T1.action_value = 'search' GROUP BY DATE(T1.timestamp); 

答えて

2

あなたはときにドンNULLの式を使用し、行のサブセットのみをカウントする必要がありますカウントしたくありません。 COUNT()はNULLを無視します。

SELECT action_type, DATE(timestamp) AS `timestamp`, 
    COUNT(CASE action_type WHEN 'click' THEN action_value END) AS `search`, 
    COUNT(CASE action_type WHEN 'delete' THEN action_value END) AS `delete`, 
FROM cohort_actions 
GROUP BY action_type, DATE(timestamp); 

私はそれらのCASE式のELSE句を持っていないのでACTION_TYPEが所望の値でない限り、式の結果はNULLです。

関連する問題