SQL PIVOT函数的用法

2024-11-17 1

PIVOT 是 SQL Server 中的一个功能,用于将行转换为列。然而,MySQL 和 Oracle 不直接支持 PIVOT 语法。但是,你可以使用条件聚合或其他技术来模拟 PIVOT 的行为。

语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-- 从子查询中选择数据,子查询从源表中选择需要的数据 
SELECT ...   
FROM    
   
      -- 源查询,从源表中选取你希望进行PIVOT操作的列 
      SELECT ...   
      FROM <source_table> 
      -- 可以包含WHERE子句、GROUP BY子句等以筛选或组织数据 
   ) AS SourceTable   
   
-- PIVOT操作,将行数据转换为列数据 
PIVOT   
   
      -- 聚合函数,用于计算每个新列的值 
      aggregate_function(<column_value>)   
      -- 指定要进行转换的列名 
      FOR <column_name>    
      -- 指定转换后新列的名称列表 
      IN ([first_pivoted_column], [second_pivoted_column], ...) 
   ) AS PivotTable;

以下是如何在 SQL Server、MySQL 和 Oracle 中实现类似 PIVOT 的操作的示例。

1. SQL Server

假设你有一个名为 sales 的表,其中包含 year, product, 和 amount 三个字段:

sql:

1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE sales ( 
    year INT
    product VARCHAR(50), 
    amount DECIMAL(10, 2) 
); 
   
INSERT INTO sales (year, product, amount) VALUES 
(2020, 'A', 100), 
(2020, 'B', 200), 
(2021, 'A', 150), 
(2021, 'B', 250);

你可以使用 PIVOT 来转换数据:

1
2
3
4
5
6
7
8
9
SELECT
FROM
    SELECT year, product, amount 
    FROM sales 
) AS source_table 
PIVOT ( 
    SUM(amount) 
    FOR product IN ([A], [B]) 
) AS pivot_table;

这将返回:

yearAB
2020100.0200.0
2021150.0250.0

2. MySQL

在 MySQL 中,你可以使用条件聚合来模拟 PIVOT:

1
2
3
4
5
SELECT year
       SUM(CASE WHEN product = 'A' THEN amount ELSE 0 END) AS 'A'
       SUM(CASE WHEN product = 'B' THEN amount ELSE 0 END) AS 'B' 
FROM sales 
GROUP BY year;

这将返回与 SQL Server 相同的结果。

3. Oracle

在 Oracle 中,你也可以使用条件聚合:

1
2
3
4
5
SELECT year
       SUM(CASE WHEN product = 'A' THEN amount ELSE 0 END) AS "A"
       SUM(CASE WHEN product = 'B' THEN amount ELSE 0 END) AS "B" 
FROM sales 
GROUP BY year;

这将返回与 SQL Server 和 MySQL 相同的结果。

请注意,虽然上述查询在逻辑上模拟了 PIVOT 的行为,但它们并不是真正的 PIVOT 语法。如果你需要在多个列或动态列上进行转换,那么你可能需要构建更复杂的查询或使用存储过程来动态生成 SQL。