返回

SQL行转列、列转行,学会这些你就是大神

后端

数据透视:SQL Server 中的行转列和列转行

数据转换的强大工具

在数据分析和处理中,经常需要将数据从一种形式转换为另一种形式。SQL Server 提供了强大而灵活的数据透视功能,使我们能够轻松实现这些转换,例如行转列和列转行。

行转列:从宽表到长表

场景:

当我们有一个包含多列数据的表时,我们需要将其转换为一个包含多行数据的表。例如,我们有一个表包含每个产品在不同月份的销售额:

| ID | 产品名称 | 2023 年 1 月销售额 | 2023 年 2 月销售额 | 2023 年 3 月销售额 |
|---|---|---|---|---|
| 1 | 产品 A | 100 | 200 | 300 |
| 2 | 产品 B | 50 | 100 | 150 |

解决方案:

使用 CASE 表达式,我们可以将此表转换为一个包含产品 ID、产品名称和每月销售额的表:

SELECT ID, ProductName,
       SUM(CASE WHEN YEAR(Date) = 2023 AND MONTH(Date) = 1 THEN Quantity * UnitPrice ELSE 0 END) AS '2023 年 1 月销售额',
       SUM(CASE WHEN YEAR(Date) = 2023 AND MONTH(Date) = 2 THEN Quantity * UnitPrice ELSE 0 END) AS '2023 年 2 月销售额',
       SUM(CASE WHEN YEAR(Date) = 2023 AND MONTH(Date) = 3 THEN Quantity * UnitPrice ELSE 0 END) AS '2023 年 3 月销售额'
FROM Sales
GROUP BY ID, ProductName

结果:

| ID | 产品名称 | 2023 年 1 月销售额 | 2023 年 2 月销售额 | 2023 年 3 月销售额 |
|---|---|---|---|---|
| 1 | 产品 A | 100 | 200 | 300 |
| 2 | 产品 B | 50 | 100 | 150 |

列转行:从长表到宽表

场景:

相反,我们可能需要将包含多行数据的表转换为一个包含多列数据的表。例如,我们有一个表包含每个产品的单价、数量和日期:

| ID | 产品名称 | 单价 | 数量 | 日期 |
|---|---|---|---|---|
| 1 | 产品 A | 10 | 10 | 2023-01-01 |
| 1 | 产品 A | 10 | 20 | 2023-02-01 |
| 1 | 产品 A | 10 | 30 | 2023-03-01 |
| 2 | 产品 B | 20 | 5 | 2023-01-01 |
| 2 | 产品 B | 20 | 10 | 2023-02-01 |
| 2 | 产品 B | 20 | 15 | 2023-03-01 |

解决方案:

使用 UNPIVOT 语句,我们可以将此表转换为一个包含产品 ID、产品名称、单价、数量和月份的表:

SELECT ID, ProductName,
       UnitPrice, Quantity,
       CASE
           WHEN Date = '2023 年 1 月' THEN '2023-01-01'
           WHEN Date = '2023 年 2 月' THEN '2023-02-01'
           WHEN Date = '2023 年 3 月' THEN '2023-03-01'
       END AS Date
FROM Sales
UNPIVOT (
    UnitPrice, Quantity FOR Date IN (
        '2023 年 1 月', '2023 年 2 月', '2023 年 3 月'
    )
) AS Unpvt

结果:

| ID | 产品名称 | 单价 | 数量 | 日期 |
|---|---|---|---|---|
| 1 | 产品 A | 10 | 10 | 2023-01-01 |
| 1 | 产品 A | 10 | 20 | 2023-02-01 |
| 1 | 产品 A | 10 | 30 | 2023-03-01 |
| 2 | 产品 B | 20 | 5 | 2023-01-01 |
| 2 | 产品 B | 20 | 10 | 2023-02-01 |
| 2 | 产品 B | 20 | 15 | 2023-03-01 |

总结

行转列和列转行是 SQL Server 中强大的数据透视工具,使我们能够轻松地将数据从一种形式转换为另一种形式。通过理解这些技术,我们可以有效地处理和分析数据,从而获得有价值的见解。

常见问题解答

  1. 行转列和列转行有什么区别?

    • 行转列将宽表转换为长表,而列转行将长表转换为宽表。
  2. 我如何确定使用行转列还是列转行?

    • 使用行转列当您需要从每个记录中提取多列数据时。使用列转行当您需要将多行数据组合到一列中时。
  3. 是否可以同时使用行转列和列转行?

    • 是的,可以。您可以将行转列和列转行组合起来执行复杂的数据转换。
  4. 行转列和列转行可以用于哪些类型的场景?

    • 行转列可用于创建交叉表、透视表和报告。列转行可用于数据规范化、聚合和数据分析。
  5. 如何优化行转列和列转行的性能?

    • 使用索引、适当的聚簇键和高效的查询优化技术来优化性能。