使用 MySQL 将单元格值旋转到列中
Pivot cell values into columns using MySQL
当运行这个查询时:
SELECT * FROM content_events
我得到一个 table 这样的:
+------+-------------+
| hour | event_type |
+------+-------------+
| 1 | loaded |
| 2 | viewability |
| 3 | play |
| 4 | loaded |
| 1 | viewability |
| 2 | play |
| 3 | loaded |
| 4 | viewability |
| 5 | play |
| 1 | loaded |
| 2 | viewability |
+------+-------------+
我想旋转它,所以我这样得到它:
+------+--------+------+-------------+
| hour | loaded | play | viewability |
+------+--------+------+-------------+
| 1 | 2 | | 1 |
| 2 | | 1 | 2 |
| 3 | 1 | 1 | |
| 4 | 1 | | 1 |
| 5 | | 1 | |
+------+--------+------+-------------+
为此,我是否应该先创建一个名为 value 的虚拟列,在每个单元格中包含“1”?换句话说,做一个 select 这样的:
SELECT *, 1 as value FROM content_events
这会 return 这个:
+------+-------------+-------+
| hour | event_type | value |
+------+-------------+-------+
| 1 | loaded | 1 |
| 2 | viewability | 1 |
| 3 | play | 1 |
| 4 | loaded | 1 |
| 1 | viewability | 1 |
| 2 | play | 1 |
| 3 | loaded | 1 |
| 4 | viewability | 1 |
| 5 | play | 1 |
| 1 | loaded | 1 |
| 2 | viewability | 1 |
+------+-------------+-------+
然后使用那个 table 做一个支点?如果该假设是正确的,数据透视查询将如何?
如有任何帮助,我们将不胜感激。
期待得到答案! :)
非常感谢!
Mysql/most rdbms 使用条件聚合来做你想做的事。
SELECT
hour
,COUNT(CASE WHEN event_type = 'loaded' tHEN event_type END) as loaded
,COUNT(CASE WHEN event_type = 'play' tHEN event_type END) as play
,COUNT(CASE WHEN event_type = 'viewability' tHEN event_type END) as viewability
FROM
content_events t
GROUP BY
hour
ORDER BY
hour
sql-服务器为您解答。无需添加额外的 1 列
SELECT *
FROM
content_events e
PIVOT (
COUNT(event_type)
FOR event_type IN (loaded,play,viewability)
) p
当运行这个查询时:
SELECT * FROM content_events
我得到一个 table 这样的:
+------+-------------+
| hour | event_type |
+------+-------------+
| 1 | loaded |
| 2 | viewability |
| 3 | play |
| 4 | loaded |
| 1 | viewability |
| 2 | play |
| 3 | loaded |
| 4 | viewability |
| 5 | play |
| 1 | loaded |
| 2 | viewability |
+------+-------------+
我想旋转它,所以我这样得到它:
+------+--------+------+-------------+
| hour | loaded | play | viewability |
+------+--------+------+-------------+
| 1 | 2 | | 1 |
| 2 | | 1 | 2 |
| 3 | 1 | 1 | |
| 4 | 1 | | 1 |
| 5 | | 1 | |
+------+--------+------+-------------+
为此,我是否应该先创建一个名为 value 的虚拟列,在每个单元格中包含“1”?换句话说,做一个 select 这样的:
SELECT *, 1 as value FROM content_events
这会 return 这个:
+------+-------------+-------+
| hour | event_type | value |
+------+-------------+-------+
| 1 | loaded | 1 |
| 2 | viewability | 1 |
| 3 | play | 1 |
| 4 | loaded | 1 |
| 1 | viewability | 1 |
| 2 | play | 1 |
| 3 | loaded | 1 |
| 4 | viewability | 1 |
| 5 | play | 1 |
| 1 | loaded | 1 |
| 2 | viewability | 1 |
+------+-------------+-------+
然后使用那个 table 做一个支点?如果该假设是正确的,数据透视查询将如何?
如有任何帮助,我们将不胜感激。
期待得到答案! :)
非常感谢!
Mysql/most rdbms 使用条件聚合来做你想做的事。
SELECT
hour
,COUNT(CASE WHEN event_type = 'loaded' tHEN event_type END) as loaded
,COUNT(CASE WHEN event_type = 'play' tHEN event_type END) as play
,COUNT(CASE WHEN event_type = 'viewability' tHEN event_type END) as viewability
FROM
content_events t
GROUP BY
hour
ORDER BY
hour
sql-服务器为您解答。无需添加额外的 1 列
SELECT *
FROM
content_events e
PIVOT (
COUNT(event_type)
FOR event_type IN (loaded,play,viewability)
) p