MySQL转置表
我有一个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| 问
|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_类型是所需的值