MySQL 中将列转换为行的技巧
在 MySQL 中处理以列形式组织的数据时,您可能需要将其转换为以行为单位呈现数据的格式。这个过程称为解旋(Unpivoting)。
问题:
考虑以下表格:
<code>ID | a | b | c 1 | a1 | b1 | c1 2 | a2 | b2 | c2</code>
目标是将列转换为行,得到如下结构的表:
<code>ID | 值 | 列名 1 | a1 | a 1 | b1 | b 1 | c1 | c 2 | a2 | a 2 | b2 | b 2 | c2 | c</code>
解决方案:
与其他一些数据库不同,MySQL 没有内置的解旋函数。要获得所需的结果,您可以使用 UNION ALL
查询来合并单独的查询,这些查询选择性地将每一列转换为行:
<code class="language-sql">SELECT id, 'a' AS col, a AS value FROM yourtable UNION ALL SELECT id, 'b' AS col, b AS value FROM yourtable UNION ALL SELECT id, 'c' AS col, c AS value FROM yourtable;</code>
此查询生成三组数据:每列一组。每组包含 ID、列名和相应的值。
使用 CROSS JOIN:
另一种方法是使用 CROSS JOIN
:
<code class="language-sql">SELECT t.id, c.col, CASE c.col WHEN 'a' THEN a WHEN 'b' THEN b WHEN 'c' THEN c END AS data FROM yourtable t CROSS JOIN ( SELECT 'a' AS col UNION ALL SELECT 'b' UNION ALL SELECT 'c' ) c;</code>
在这种情况下,CROSS JOIN
在 yourtable
的行和生成列名的子查询的行之间创建笛卡尔积。CASE
语句将每个列名映射到其对应的列值。
这两种方法都能有效地解旋数据,为您提供所需的基于行的结构。
以上是如何在 MySQL 中将列逆透视为行?的详细内容。更多信息请关注PHP中文网其他相关文章!