首页 > 数据库 > mysql教程 > 如何在MySQL中旋转表:将行转换为列?

如何在MySQL中旋转表:将行转换为列?

Patricia Arquette
发布: 2025-01-25 11:26:10
原创
607 人浏览过

How to Pivot a Table in MySQL: Transforming Rows into Columns?

将表重塑为将行转换为列

问题:

将一个包含三列的表转换为一个数据透视表,其中行变为列。

示例:

输入表:

hostid itemname itemvalue
1 A 10
1 B 3
2 A 9
2 C 40

所需输出(数据透视表):

hostid A B C
1 10 3 0
2 9 0 40

解决方案:

MySQL 的数据透视功能涉及一个三步过程:

  1. 选择感兴趣的列:
<code class="language-sql">SELECT hostid, itemname, itemvalue
FROM history;</code>
登录后复制
  1. 使用额外列扩展基本表:

添加与每个唯一 itemname 对应的列。

<code class="language-sql">CREATE VIEW history_extended AS (
  SELECT
    history.*,
    CASE WHEN itemname = "A" THEN itemvalue END AS A,
    CASE WHEN itemname = "B" THEN itemvalue END AS B,
    CASE WHEN itemname = "C" THEN itemvalue END AS C
  FROM history
);</code>
登录后复制
  1. 分组和聚合扩展表:

按 hostid 分组,并对每一列的值求和。

<code class="language-sql">CREATE VIEW history_itemvalue_pivot AS (
  SELECT
    hostid,
    SUM(A) AS A,
    SUM(B) AS B,
    SUM(C) AS C
  FROM history_extended
  GROUP BY hostid
);</code>
登录后复制
  1. 可选:美化聚合表(将 NULL 值替换为 0)
<code class="language-sql">CREATE VIEW history_itemvalue_pivot_pretty AS (
  SELECT
    hostid,
    COALESCE(A, 0) AS A,
    COALESCE(B, 0) AS B,
    COALESCE(C, 0) AS C
  FROM history_itemvalue_pivot
);</code>
登录后复制

注意事项和限制:

  • 此解决方案假设数据透视列具有特定值(此处为 itemvalue)。
  • 它支持多个 y 值 (hostid),但仅限于手动添加数据透视列。
  • 使用大量列生成数据透视表可能具有挑战性。

以上是如何在MySQL中旋转表:将行转换为列?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板