SQL中PIVOT函数的用法

打印 上一主题 下一主题

主题 551|帖子 551|积分 1653


媒介

PIVOT 是 SQL Server 中的一个功能,用于将行转换为列。然而,MySQL 和 Oracle 不直接支持 PIVOT 语法。但是,你可以利用条件聚合或其他技术来模仿 PIVOT 的行为。
   语法:
  1. -- 从子查询中选择数据,子查询从源表中选择需要的数据  
  2. SELECT ...   
  3. FROM     
  4.    (  
  5.       -- 源查询,从源表中选取你希望进行PIVOT操作的列  
  6.       SELECT ...   
  7.       FROM <source_table>  
  8.       -- 可以包含WHERE子句、GROUP BY子句等以筛选或组织数据  
  9.    ) AS SourceTable   
  10.   
  11. -- PIVOT操作,将行数据转换为列数据  
  12. PIVOT   
  13.    (  
  14.       -- 聚合函数,用于计算每个新列的值  
  15.       aggregate_function(<column_value>)   
  16.       -- 指定要进行转换的列名  
  17.       FOR <column_name>     
  18.       -- 指定转换后新列的名称列表  
  19.       IN ([first_pivoted_column], [second_pivoted_column], ...)  
  20.    ) AS PivotTable;
复制代码

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

假设你有一个名为 sales 的表,其中包罗 year, product, 和 amount 三个字段:
   sql:
  1. CREATE TABLE sales (  
  2.     year INT,  
  3.     product VARCHAR(50),  
  4.     amount DECIMAL(10, 2)  
  5. );  
  6.   
  7. INSERT INTO sales (year, product, amount) VALUES  
  8. (2020, 'A', 100),  
  9. (2020, 'B', 200),  
  10. (2021, 'A', 150),  
  11. (2021, 'B', 250);
复制代码
你可以利用 PIVOT 来转换数据:
  1. SELECT *  
  2. FROM (  
  3.     SELECT year, product, amount  
  4.     FROM sales  
  5. ) AS source_table  
  6. PIVOT (  
  7.     SUM(amount)  
  8.     FOR product IN ([A], [B])  
  9. ) AS pivot_table;
复制代码
这将返回:
yearAB2020100.0200.02021150.0250.0 2. MySQL

在 MySQL 中,你可以利用条件聚合来模仿 PIVOT:
  1. SELECT year,  
  2.        SUM(CASE WHEN product = 'A' THEN amount ELSE 0 END) AS 'A',  
  3.        SUM(CASE WHEN product = 'B' THEN amount ELSE 0 END) AS 'B'  
  4. FROM sales  
  5. GROUP BY year;
复制代码
这将返回与 SQL Server 雷同的结果。
3. Oracle

在 Oracle 中,你也可以利用条件聚合:
  1. SELECT year,  
  2.        SUM(CASE WHEN product = 'A' THEN amount ELSE 0 END) AS "A",  
  3.        SUM(CASE WHEN product = 'B' THEN amount ELSE 0 END) AS "B"  
  4. FROM sales  
  5. GROUP BY year;
复制代码
这将返回与 SQL Server 和 MySQL 雷同的结果。
请注意,虽然上述查询在逻辑上模仿了 PIVOT 的行为,但它们并不是真正的 PIVOT 语法。如果你必要在多个列或动态列上进行转换,那么你可能必要构建更复杂的查询或利用存储过程来动态天生 SQL。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用多少眼泪才能让你相信

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表