MySQL转置表

时间:2016-07-19 22:44:43

标签: mysql sql group-by

我有一个具有以下结构的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|timestamp |search|delete|
|-----------|----------|------|------|
|click      |20-07-2016|2     |1     |
|-----------|----------|------|------|

对于给定的action_type,返回执行该操作的所有用户并按时间戳对其进行分组。

我尝试了以下查询,但我只是在两列中得到相同的数字:

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);

1 个答案:

答案 0 :(得分: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。