mysql横表怎么转纵表
时间 : 2023-03-21 10:37:02声明: : 文章内容来自网络,不保证准确性,请自行甄别信息有效性

在 MySQL 中,将纵表转换为横表(或者横表转换为纵表)通常使用 SQL 语句来实现。将横表转换为纵表,又被称为行转列或者数据透视表。在不同的场景下,数据管理员需要将横表转换为纵表,以使数据更易于分析和查询。接下来,通过一个实例来演示将 MySQL 中的横表转换为纵表的过程。

在 MySQL 中使用 CASE WHEN 语句进行转换

下面的是我们需要转换的 MySQL 横表:

| id | name | subject | result |

|----|------|---------|--------|

| 1 | Tom | Math | 90 |

| 1 | Tom | English | 80 |

| 1 | Tom | Science | 70 |

| 2 | John | Math | 60 |

| 2 | John | English | 70 |

| 2 | John | Science | 80 |

我们需要将其转换为如下的纵表:

| id | name | Math | English | Science |

|----|------|------|---------|---------|

| 1 | Tom | 90 | 80 | 70 |

| 2 | John | 60 | 70 | 80 |

为了达到这个效果,我们可以使用 MySQL 中的 CASE 语句,将横表转换为纵表:

SELECT

id,

name,

MAX(CASE WHEN subject = 'Math' THEN result ELSE NULL END) AS Math,

MAX(CASE WHEN subject = 'English' THEN result ELSE NULL END) AS English,

MAX(CASE WHEN subject = 'Science' THEN result ELSE NULL END) AS Science

FROM

scores

GROUP BY

id,

name;

在这个示例中,我们使用了 MAX 和 CASE WHEN 语句,将每行的学生id,姓名和科目成绩组合成一行。然后,我们分别使用 CASE WHEN 语句来将每个学科成绩作为单独的列,这样数据就被转换为了纵表。

总结

MySQL 的 CASE WHEN 语句,可用于将 MySQL 中的横表转换为纵表。这个技术可以方便数据管理员在实际的数据分析过程中,更好地组织数据,使得数据分析更加高效。

在 MySQL 中,我们可以通过 PIVOT 操作将横表转换成纵表。横表是指一张表中每个记录的数据被分散在多个字段中,而纵表是指一张表中每个记录的数据被组合在同一个字段或几个字段中。

首先,让我们创建一个包含以下字段的横表:

```sql

CREATE TABLE scores (

id INT PRIMARY KEY,

name VARCHAR(50),

subject VARCHAR(50),

score FLOAT

);

INSERT INTO scores VALUES (1, 'Alice', 'Math', 80);

INSERT INTO scores VALUES (1, 'Alice', 'Chinese', 90);

INSERT INTO scores VALUES (1, 'Alice', 'English', 85);

INSERT INTO scores VALUES (2, 'Bob', 'Math', 90);

INSERT INTO scores VALUES (2, 'Bob', 'Chinese', 70);

INSERT INTO scores VALUES (2, 'Bob', 'English', 75);

这张表包含了学生姓名、科目和成绩。每个学生有三条记录,分别代表他们在三门课程中的成绩。

我们想要将这个横表转换成一个纵表,其中每个学生只有一条记录,列出了他们的姓名、数学成绩、语文成绩和英语成绩。要做到这一点,我们需要使用 GROUP BY 和 PIVOT 操作。

下面是使用 MySQL 进行这个操作的代码:

```sql

SELECT name,

MAX(CASE WHEN subject = 'Math' THEN score ELSE NULL END) AS `Math`,

MAX(CASE WHEN subject = 'Chinese' THEN score ELSE NULL END) AS `Chinese`,

MAX(CASE WHEN subject = 'English' THEN score ELSE NULL END) AS `English`

FROM scores

GROUP BY name;

这段代码的基本思路是,使用 GROUP BY 将相同姓名的记录分组。然后使用 PIVOT 操作将每门课程的成绩转换成一列,最终我们得到了纵向排列的表格。

这里的 PIVOT 操作使用了一个 CASE 语句。对于每个记录,我们使用 CASE 语句来判断它属于哪个科目,并根据情况返回相应的成绩或 NULL。然后使用 MAX 函数将这个数值转化为数字类型并将其转化为一个列。这样做的原因是因为 PIVOT 操作必须要使用一个聚合函数才能起作用,在这个例子中我们使用了 MAX 函数。

最后,将结果按姓名排序并显示出来,我们可以得到以下结果:

+-------+------+---------+---------+

| name | Math | Chinese | English |

+-------+------+---------+---------+

| Alice | 80 | 90 | 85 |

| Bob | 90 | 70 | 75 |

+-------+------+---------+---------+

可以看到,我们成功地将横表转换成了纵表,并将每个学生的成绩组合在了同一列中。

总结一下,将横表转换成纵表可能需要使用 GROUP BY 和 PIVOT 操作。GROUP BY 可以将相同记录分组,而 PIVOT 操作可以将一条记录中的某些字段分配到多列中。关于 PIVOT 操作,还可以使用其他函数如 SUM、AVG 和 COUNT 等。