📜  sql 将行汇总为列 - SQL (1)

📅  最后修改于: 2023-12-03 15:20:16.875000             🧑  作者: Mango

SQL 将行汇总为列

在 SQL 中,有时需要对多行数据进行汇总处理,将它们转换为单行数据,以便更方便地进行统计和分析。这时可以使用 SQL 的行转列(Pivot)功能,把若干行数据转换为一行,以列的形式呈现。

Pivot 操作

Pivot 操作是一种将行转化成列的操作。它将根据某一列的值作为新表的列名,而该列的值将成为新表的行数据。例如,下面是一个示例表格 orders:

| order_id | customer | product | amount | | -------- | -------- | ------- | ------ | | 1 | John | Apple | 2 | | 2 | John | Banana | 3 | | 3 | Mary | Apple | 1 | | 4 | Mary | Banana | 4 |

假设按照顾客来汇总这张表,得到的结果如下:

| customer | Apple | Banana | | -------- | ----- | ------ | | John | 2 | 3 | | Mary | 1 | 4 |

在 SQL 中实现这个操作,可以使用 PIVOT 操作符。具体语法如下:

SELECT [column1], [column2], ... [columnN]
FROM [table]
PIVOT (
    [aggregate function]([pivot column])
    FOR [pivot column]
    IN ([value1], [value2], ... [valueN])
)

其中,[column1] 到 [columnN] 是需要选择的列;[table] 是需要进行 PIVOT 操作的原始表格;[aggregate function] 是聚合函数,例如 SUM、AVG、MAX、MIN 等等;[pivot column] 是需要变成列的列名;[value1] 到 [valueN] 是需要作为列的值。

Pivot 实例

接下来用一个实例来演示 PIVOT 的用法。假设有如下的员工工资表:

| 月份 | 员工号 | 工资 | | ---- | ---- | ---- | | 1 | 001 | 3000 | | 1 | 002 | 4000 | | 1 | 003 | 5000 | | 2 | 001 | 3500 | | 2 | 002 | 4500 | | 2 | 003 | 5500 |

可使用 PIVOT 操作将其行转列,输出结果如下:

| 员工号 | 1月工资 | 2月工资 | | ---- | ----- | ----- | | 001 | 3000 | 3500 | | 002 | 4000 | 4500 | | 003 | 5000 | 5500 |

这个查询语句如下:

SELECT *
FROM (
    SELECT month, empno, salary
    FROM Salary
) s
PIVOT (
    SUM(salary)
    FOR month
    IN ([1], [2])
) p

经过 PIVOT 操作后,原来月份的列变成了 1 和 2 两列,对应的是每个员工的月工资。在此过程中,聚合函数使用的是 SUM 函数。