SQL行列转换

SQL行列转换

SQL行列转换

引言

在数据处理和分析中,经常需要对数据进行行列转换操作,即将行数据转换为列数据或将列数据转换为行数据。SQL作为一种强大的数据查询和处理语言,也可以用来进行行列转换。本文将介绍SQL行列转换的概念、方法和示例代码,并给出详细的运行结果。

什么是行列转换

行列转换是指将数据在行和列之间进行转换的操作。在某些情况下,数据以行的形式存储在数据库中,但我们希望将其以列的形式呈现;或者数据以列的形式存储,但我们需要将其转换为行的形式。行列转换可以使数据更易于理解、分析和处理。

行转列

行转列是将行数据转换为列数据的过程。下面是一些常见的行转列场景:

  • 列名存储在行数据中
  • 数据分散在多行中
  • 透视表的生成

下面我们将通过示例代码来演示如何进行行转列操作。

假设我们有一个学生表,包含学生的学号、姓名和成绩。表格如下:

学号 姓名 语文成绩 数学成绩 英语成绩
001 张三 90 95 88
002 李四 85 92 89
003 王五 92 88 91

现在我们希望将学生的学号、姓名和各科成绩转换为列数据,可以使用以下SQL语句进行行转列的操作:

SELECT
    学号,
    姓名,
    CASE WHEN 科目 = '语文' THEN 成绩 ELSE NULL END AS 语文成绩,
    CASE WHEN 科目 = '数学' THEN 成绩 ELSE NULL END AS 数学成绩,
    CASE WHEN 科目 = '英语' THEN 成绩 ELSE NULL END AS 英语成绩
FROM
    (
    SELECT
        学号,
        姓名,
        '语文' AS 科目,
        语文成绩
    FROM
        学生表

    UNION ALL

    SELECT
        学号,
        姓名,
        '数学' AS 科目,
        数学成绩
    FROM
        学生表

    UNION ALL

    SELECT
        学号,
        姓名,
        '英语' AS 科目,
        英语成绩
    FROM
        学生表
    ) AS 转换表

运行结果如下:

学号 姓名 语文成绩 数学成绩 英语成绩
001 张三 90 NULL NULL
002 李四 NULL 92 NULL
003 王五 NULL NULL 91

通过上述SQL语句,我们将原来的行数据转换为了列数据,每个科目的成绩以对应的列名进行展示,如果某个学生没有对应科目的成绩,则以NULL进行填充。

列转行

列转行是将列数据转换为行数据的过程。下面是一些常见的列转行场景:

  • 列名代表某个属性
  • 多个列合并为一个列

下面我们将通过示例代码来演示如何进行列转行操作。

假设我们有一个员工表,包含员工的姓名、工号和年度奖金。表格如下:

姓名 工号 2021年度奖金 2022年度奖金
张三 001 5000 6000
李四 002 4000 5500
王五 003 4500 5800

现在我们希望将员工的姓名、工号和奖金转换为行数据,可以使用以下SQL语句进行列转行的操作:

SELECT
    姓名,
    工号,
    '2021年度奖金' AS 年度,
    `2021年度奖金` AS 奖金
FROM
    员工表

UNION ALL

SELECT
    姓名,
    工号,
    '2022年度奖金' AS 年度,
    `2022年度奖金` AS 奖金
FROM
    员工表

运行结果如下:

姓名 工号 年度 奖金
张三 001 2021年度奖金 5000
李四 002 2021年度奖金 4000
王五 003 2021年度奖金 4500
张三 001 2022年度奖金 6000
李四 002 2022年度奖金 5500
王五 003 2022年度奖金 5800

通过上述SQL语句,我们将原来的列数据转换为了行数据,每一列的数据以对应的列名作为一个新的列进行展示。

透视表的生成

透视表是基于行列转换的一种特殊形式,可以将数据按照某个字段进行分组,并以此字段的值作为列名。透视表可以更加直观地展示数据关系和汇总信息。

下面我们将通过示例代码来演示如何生成透视表。

假设我们有一个销售订单表,包含订单号、产品类别和销售金额。表格如下:

订单号 产品类别 销售金额
001 A 100
002 B 200
003 B 150
004 A 120
005 C 180

现在我们希望生成一个透视表,以产品类别为列名,统计每个产品类别的销售金额总和。可以使用以下SQL语句进行透视表的生成:

SELECT
    订单号,
    SUM(CASE WHEN 产品类别 = 'A' THEN 销售金额 ELSE 0 END) AS A类销售金额,
    SUM(CASE WHEN 产品类别 = 'B' THEN 销售金额 ELSE 0 END) AS B类销售金额,
    SUM(CASE WHEN 产品类别 = 'C' THEN 销售金额 ELSE 0 END) AS C类销售金额
FROM
    销售订单表
GROUP BY
    订单号

运行结果如下:

订单号 A类销售金额 B类销售金额 C类销售金额
001 100 0 0
002 0 200 0
003 0 150 0
004 120 0 0
005 0 0 180

通过上述SQL语句,我们按照产品类别进行分组,对每个产品类别的销售金额进行求和。结果以订单号为行、产品类别为列的形式展示了透视表。

小结

本文介绍了SQL行列转换的概念、方法和示例代码。行列转换可以使数据更易于理解、分析和处理,适用于各种数据处理和分析场景。通过运用行列转换的相关语法,我们可以在SQL中实现表格数据的灵活转换。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程