Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL转置表_Mysql_Sql_Group By - Fatal编程技术网

MySQL转置表

MySQL转置表,mysql,sql,group-by,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| 问

我有一个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_value是可以采取Action_类型的值。这是每个用户/每个日期的操作,我想知道是否可以进行一个返回以下内容的查询:

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

当您只需要对行的子集进行计数时,请在不想计数时使用空表达式。COUNT()忽略空值

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子句,因此表达式的结果为NULL,除非action_类型是所需的值