SQL中PIVOT函数的用法

SQL中PIVOT函数的用法

码农世界 2024-06-04 后端 88 次浏览 0个评论

文章目录

  • 前言
  • 1. SQL Server
  • 2. MySQL
  • 3. Oracle

    前言

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

    语法:

    -- 从子查询中选择数据,子查询从源表中选择需要的数据  
    SELECT ...    
    FROM     
       (  
          -- 源查询,从源表中选取你希望进行PIVOT操作的列  
          SELECT ...    
          FROM   
          -- 可以包含WHERE子句、GROUP BY子句等以筛选或组织数据  
       ) AS SourceTable    
      
    -- PIVOT操作,将行数据转换为列数据  
    PIVOT    
       (  
          -- 聚合函数,用于计算每个新列的值  
          aggregate_function()    
          -- 指定要进行转换的列名  
          FOR      
          -- 指定转换后新列的名称列表  
          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;
    

    这将返回:

    yearAB
    2020100.0200.0
    2021150.0250.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。

转载请注明来自码农世界,本文标题:《SQL中PIVOT函数的用法》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,88人围观)参与讨论

还没有评论,来说两句吧...

Top