SQL行列转换:从行转列和列转行方面详解

一、SQL行转列列转行函数

在SQL语言中,行转列和列转行操作常用的函数有PIVOT和UNPIVOT函数。

1. PIVOT函数

PIVOT函数可以将数据从行转换为列。它使用聚合函数在值上执行转置操作,并将唯一值作为列标题。以下是一个示例:

SELECT *
FROM
(SELECT cust_id, prod_id, quantity
FROM orders)
PIVOT
(SUM(quantity)
FOR prod_id IN ([100], [200], [300], [400], [500])) as p;

上面的查询代码中:从orders表中查询cust_id、prod_id和quantity三列,并使用pivot函数将prod_id列中的值以[100],[200],[300],[400],[500]为列标题转换成列。最后结果如下:

+---------+-----+-----+-----+-----+-----+
| cust_id | 100 | 200 | 300 | 400 | 500 |
+---------+-----+-----+-----+-----+-----+
|    1    |  2  |  4  |  8  |  4  |  3  |
+---------+-----+-----+-----+-----+-----+
|    2    |  5  |  9  |  1  |  0  |  2  |
+---------+-----+-----+-----+-----+-----+

2. UNPIVOT函数

UNPIVOT函数与PIVOT函数相反,将列转换为行。它使用UNION操作符将列转换为行。

SELECT cust_id, prod_id, quantity
FROM
(SELECT *
FROM orders
PIVOT
(SUM(quantity)
FOR prod_id IN ([100], [200], [300], [400], [500])) as p)
UNPIVOT
(quantity
FOR prod_id IN ([100], [200], [300], [400], [500])) as u;

上面的查询代码中:使用PIVOT函数将prod_id列中的值以[100],[200],[300],[400],[500]为列标题转换为列,然后使用UNPIVOT函数将列值转换为行。最后结果如下:

+---------+---------+----------+
| cust_id | prod_id | quantity |
+---------+---------+----------+
|    1    |   100   |    2     |
+---------+---------+----------+
|    1    |   200   |    4     |
+---------+---------+----------+
|    1    |   300   |    8     |
+---------+---------+----------+
|    1    |   400   |    4     |
+---------+---------+----------+
|    1    |   500   |    3     |
+---------+---------+----------+
|    2    |   100   |    5     |
+---------+---------+----------+
|    2    |   200   |    9     |
+---------+---------+----------+
|    2    |   300   |    1     |
+---------+---------+----------+
|    2    |   400   |    0     |
+---------+---------+----------+
|    2    |   500   |    2     |
+---------+---------+----------

二、SQL行列转换

1. SQL行转列

SQL行转列是指将行数据转换为列数据。在SQL Server中可以通过UNPIVOT函数将行转换为列。以下是示例:

SELECT cust_id, q1, q2, q3, q4, q5
FROM (SELECT cust_id, prod_id, quantity
FROM orders) p
PIVOT
(SUM(quantity)
FOR prod_id IN (q1, q2, q3, q4, q5)) as pvt;

上面的查询代码中:从orders表中查询cust_id、prod_id和quantity三列,使用PIVOT函数将prod_id列中的值以q1、q2、q3、q4、q5为列标题转换为列,最后结果如下:

+---------+----+----+----+----+----+
| cust_id | q1 | q2 | q3 | q4 | q5 |
+---------+----+----+----+----+----+
|    1    | 2  | 4  | 8  | 4  | 3  |
+---------+----+----+----+----+----+
|    2    | 5  | 9  | 1  | 0  | 2  |
+---------+----+----+----+----+----

2. SQL列转行

SQL列转行是指将列数据转换为行数据。在SQL Server中可以使用UNPIVOT函数将列转换为行。以下是示例:

SELECT cust_id, prod_id, quantity
FROM
(SELECT *
FROM orders
PIVOT
(SUM(quantity)
FOR prod_id IN ([100], [200], [300], [400], [500])) as p)
UNPIVOT
(quantity
FOR prod_id IN ([100], [200], [300], [400], [500])) as u;

上面的查询代码中:使用PIVOT函数将prod_id列中的值以[100],[200],[300],[400],[500]为列标题转换为列,然后使用UNPIVOT函数将列值转换为行。最后结果如下:

+---------+---------+----------+
| cust_id | prod_id | quantity |
+---------+---------+----------+
|    1    |   100   |    2     |
+---------+---------+----------+
|    1    |   200   |    4     |
+---------+---------+----------+
|    1    |   300   |    8     |
+---------+---------+----------+
|    1    |   400   |    4     |
+---------+---------+----------+
|    1    |   500   |    3     |
+---------+---------+----------+
|    2    |   100   |    5     |
+---------+---------+----------+
|    2    |   200   |    9     |
+---------+---------+----------+
|    2    |   300   |    1     |
+---------+---------+----------+
|    2    |   400   |    0     |
+---------+---------+----------+
|    2    |   500   |    2     |
+---------+---------+----------

三、SQL行转列列转行的详细过程

1. SQL行转列的过程

SQL行转列是指将行数据转换为列数据。具体步骤如下:

Step 1:从数据表中选择需要转换的列。

SELECT cust_id, prod_id, quantity
FROM orders

Step 2:将选择的列作为子查询进行聚合,生成需要转换的数据。

SELECT cust_id, prod_id, SUM(quantity) AS QTY_total
FROM orders
GROUP BY cust_id, prod_id

Step 3:使用PIVOT函数将转换后的数据从行转换为列。

SELECT cust_id, [101], [102], [103], [104], [105]
FROM
(SELECT cust_id, prod_id, SUM(quantity) AS QTY_total
FROM orders
GROUP BY cust_id, prod_id) AS t
PIVOT
(SUM(QTY_total)
FOR prod_id IN ([101], [102], [103], [104], [105])) AS pvt;

2. SQL列转行的过程

SQL列转行是指将列数据转换为行数据。具体步骤如下:

Step 1:从数据表中选择需要转换的列。

SELECT *
FROM
(SELECT cust_id, [101], [102], [103], [104], [105]
FROM orders) AS t

Step 2:使用UNPIVOT函数将列转换为行。

SELECT cust_id, prod_id, quantity
FROM
(SELECT cust_id, [101], [102], [103], [104], [105]
FROM orders) AS t
UNPIVOT
(quantity
FOR prod_id IN ([101], [102], [103], [104], [105])) AS u;

四、SQL行转列三种方式

1. 使用PIVOT函数

使用PIVOT函数将数据从行转换为列,以下是示例代码:

SELECT cust_id, [101], [102], [103], [104], [105]
FROM
(SELECT cust_id, prod_id, quantity
FROM orders) AS t
PIVOT
(SUM(quantity)
FOR prod_id IN ([101], [102], [103], [104], [105])) AS pvt;

2. 使用CASE语句和聚合函数

使用CASE语句和聚合函数将数据从行转换为列,以下是示例代码:

SELECT cust_id,
SUM(CASE WHEN prod_id = '101' THEN quantity ELSE 0 END) AS '101',
SUM(CASE WHEN prod_id = '102' THEN quantity ELSE 0 END) AS '102',
SUM(CASE WHEN prod_id = '103' THEN quantity ELSE 0 END) AS '103',
SUM(CASE WHEN prod_id = '104' THEN quantity ELSE 0 END) AS '104',
SUM(CASE WHEN prod_id = '105' THEN quantity ELSE 0 END) AS '105'
FROM orders
GROUP BY cust_id

3. 使用UNION ALL语句

使用UNION ALL语句将数据从行转换为列,以下是示例代码:

SELECT cust_id, '101' AS prod_id, [101] AS quantity
FROM
(SELECT cust_id, [101]
FROM orders) AS t
UNPIVOT
([101]
FOR prod_id IN ([101])) AS u
UNION ALL
SELECT cust_id, '102' AS prod_id, [102] AS quantity
FROM
(SELECT cust_id, [102]
FROM orders) AS t
UNPIVOT
([102]
FOR prod_id IN ([102])) AS u
UNION ALL
SELECT cust_id, '103' AS prod_id, [103] AS quantity
FROM
(SELECT cust_id, [103]
FROM orders) AS t
UNPIVOT
([103]
FOR prod_id IN ([103])) AS u
UNION ALL
SELECT cust_id, '104' AS prod_id, [104] AS quantity
FROM
(SELECT cust_id, [104]
FROM orders) AS t
UNPIVOT
([104]
FOR prod_id IN ([104])) AS u
UNION ALL
SELECT cust_id, '105' AS prod_id, [105] AS quantity
FROM
(SELECT cust_id, [105]
FROM orders) AS t
UNPIVOT
([105]
FOR prod_id IN ([105])) AS u

其中使用UNION ALL语句将多个行转列的结果合并。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/286471.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-23 03:47
下一篇 2024-12-23 03:47

相关推荐

  • 为什么Python不能编译?——从多个方面浅析原因和解决方法

    Python作为很多开发人员、数据科学家和计算机学习者的首选编程语言之一,受到了广泛关注和应用。但与之伴随的问题之一是Python不能编译,这给基于编译的开发和部署方式带来不少麻烦…

    编程 2025-04-29
  • Hibernate日志打印sql参数

    本文将从多个方面介绍如何在Hibernate中打印SQL参数。Hibernate作为一种ORM框架,可以通过打印SQL参数方便开发者调试和优化Hibernate应用。 一、通过配置…

    编程 2025-04-29
  • 从多个方面用法介绍yes,but let me review and configure level of access

    yes,but let me review and configure level of access是指在授权过程中,需要进行确认和配置级别控制的全能编程开发工程师。 一、授权确…

    编程 2025-04-29
  • 使用SQL实现select 聚合查询结果前加序号

    select语句是数据库中最基础的命令之一,用于从一个或多个表中检索数据。常见的聚合函数有:count、sum、avg等。有时候我们需要在查询结果的前面加上序号,可以使用以下两种方…

    编程 2025-04-29
  • 理解Mybatis中的SQL Limit用法

    Mybatis是一种非常流行的ORM框架,提供了SQL映射配置文件,可以使用类似于传统SQL语言的方式编写SQL语句。其中,SQL的Limit语法是一个非常重要的知识点,能够实现分…

    编程 2025-04-29
  • 从多个方面zmjui

    zmjui是一个轻量级的前端UI框架,它实现了丰富的UI组件和实用的JS插件,让前端开发更加快速和高效。本文将从多个方面对zmjui做详细阐述,帮助读者深入了解zmjui,以便更好…

    编程 2025-04-28
  • SQL预研

    SQL预研是指在进行SQL相关操作前,通过数据分析和理解,确定操作的方法和步骤,从而避免不必要的错误和问题。以下从多个角度进行详细阐述。 一、数据分析 数据分析是SQL预研的第一步…

    编程 2025-04-28
  • 学Python用什么编辑器?——从多个方面评估各种Python编辑器

    选择一个适合自己的 Python 编辑器并不容易。除了我们开发的应用程序类型、我们面临的软件架构以及我们的编码技能之外,选择编辑器可能也是我们编写代码时最重要的决定之一。随着许多不…

    编程 2025-04-28
  • 创建列表的多个方面

    本文将从多个方面对创建列表进行详细阐述。 一、列表基本概念 列表是一种数据结构,其中元素以线性方式组织,并且具有特殊的序列位置。该位置可以通过索引或一些其他方式进行访问。在编程中,…

    编程 2025-04-28
  • Python在电气自动化控制方面的应用

    本文将为大家介绍Python在电气自动化控制方面的应用,包括基础知识、自动化测试、数据处理、仿真模拟等方面。Python是一种高级编程语言,具有简洁优雅的语法、丰富的功能库和强大的…

    编程 2025-04-27

发表回复

登录后才能评论