SQL中PIVOT函数的用法


前言

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

语法:

-- 从子查询中选择数据,子查询从源表中选择需要的数据  
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:

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 来转换数据:

SELECT *  
FROM (  
    SELECT year, product, amount  
    FROM sales  
) AS source_table  
PIVOT (  
    SUM(amount)  
    FOR product IN ([A], [B])  
) AS pivot_table;

这将返回:

year A B
2020 100.0 200.0
2021 150.0 250.0

2. MySQL

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

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 中,你也可以使用条件聚合:

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。

相关推荐

  1. SQLPIVOT函数

    2024-04-25 08:38:04       93 阅读
  2. oraclePIVOT函数

    2024-04-25 08:38:04       65 阅读
  3. SQLLAG函数与LEAD函数

    2024-04-25 08:38:04       32 阅读
  4. SQLLIMIT简单

    2024-04-25 08:38:04       50 阅读
  5. SQLWITH RECURSIVE

    2024-04-25 08:38:04       39 阅读
  6. SQLdistinct

    2024-04-25 08:38:04       29 阅读
  7. C++ STLVector函数

    2024-04-25 08:38:04       40 阅读
  8. MATLABcell函数

    2024-04-25 08:38:04       63 阅读
  9. ExcelINDIRECT函数

    2024-04-25 08:38:04       63 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-25 08:38:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-25 08:38:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-25 08:38:04       82 阅读
  4. Python语言-面向对象

    2024-04-25 08:38:04       91 阅读

热门阅读

  1. Vue入门

    Vue入门

    2024-04-25 08:38:04      37 阅读
  2. 基于vscode的c++开发(Windows)

    2024-04-25 08:38:04       74 阅读
  3. 探索简站WordPress主题:jianzhanpress.com的魅力所在

    2024-04-25 08:38:04       35 阅读
  4. Docker之常见FAQ记录清单

    2024-04-25 08:38:04       103 阅读