不过说实话,刚开始用的时候也踩过不少坑。比如聚合函数的选择,还有列名的动态变化,都得特别小心。
SQL Server的PIVOT,其实Excel的数据透视表也是异曲同工。虽然一个是写代码,一个是拖拽操作,但思路都差不多,重点无外乎行转列,还是列转行。
基础数据准备
首先,让我们创建示例数据表:
-- 创建销售数据表
CREATETABLE SalesData (
Region NVARCHAR(50),
QuarterNVARCHAR(2),
Sales DECIMAL(10,2)
);
-- 插入示例数据
INSERTINTO SalesData (Region, Quarter, Sales) VALUES
('North', 'Q1', 10000),
('North', 'Q2', 12000),
('North', 'Q3', 15000),
('North', 'Q4', 11000),
('South', 'Q1', 8000),
('South', 'Q2', 9000),
('South', 'Q3', 11000),
('South', 'Q4', 10000),
('East', 'Q1', 9000),
('East', 'Q2', 10000),
('East', 'Q3', 12000),
('East', 'Q4', 11500),
('West', 'Q1', 7000),
('West', 'Q2', 8500),
('West', 'Q3', 9500),
('West', 'Q4', 9000);复制
使用PIVOT进行数据转换
基本透视表查询
SELECT *
FROM (
SELECT Region, Quarter, Sales
FROM SalesData
) AS SourceTable
PIVOT (
SUM(Sales)
FOR Quarter IN ([Q1], [Q2], [Q3], [Q4])
) AS PivotTable;复制
这个查询将产生如下结果:

添加计算列的透视表
SELECT
Region,
[Q1], [Q2], [Q3], [Q4],
([Q1] + [Q2] + [Q3] + [Q4]) as YearTotal,
([Q1] + [Q2] + [Q3] + [Q4])/4as YearAverage
FROM (
SELECT Region, Quarter, Sales
FROM SalesData
) AS SourceTable
PIVOT (
SUM(Sales)
FORQuarterIN ([Q1], [Q2], [Q3], [Q4])
) AS PivotTable;复制

带有百分比的透视表
WITH PivotedData AS (
SELECT *
FROM (
SELECT Region, Quarter, Sales
FROM SalesData
) AS SourceTable
PIVOT (
SUM(Sales)
FORQuarterIN ([Q1], [Q2], [Q3], [Q4])
) AS PivotTable
)
SELECT
Region,
[Q1],
[Q2],
[Q3],
[Q4],
CAST([Q1] * 100.0 / ([Q1] + [Q2] + [Q3] + [Q4]) ASDECIMAL(5,2)) as Q1_Percentage,
CAST([Q2] * 100.0 / ([Q1] + [Q2] + [Q3] + [Q4]) ASDECIMAL(5,2)) as Q2_Percentage,
CAST([Q3] * 100.0 / ([Q1] + [Q2] + [Q3] + [Q4]) ASDECIMAL(5,2)) as Q3_Percentage,
CAST([Q4] * 100.0 / ([Q1] + [Q2] + [Q3] + [Q4]) ASDECIMAL(5,2)) as Q4_Percentage
FROM PivotedData;复制

动态PIVOT查询
当列值不固定时,可以使用动态SQL:
DECLARE @columnsNVARCHAR(MAX) = '';
DECLARE @sqlNVARCHAR(MAX) = '';
-- 获取所有季度并构建列名
SELECT @columns = STRING_AGG(QUOTENAME(Quarter), ',')
FROM (SELECTDISTINCTQuarterFROM SalesData) AS Quarters;
-- 构建动态SQL
SET @sql = N'
SELECT *
FROM (
SELECT Region, Quarter, Sales
FROM SalesData
) AS SourceTable
PIVOT (
SUM(Sales)
FOR Quarter IN (' + @columns + ')
) AS PivotTable;
';
-- 执行动态SQL
EXEC sp_executesql @sql;复制

注意事项
- PIVOT操作可能会影响查询性能,特别是在大数据集上
- 动态PIVOT查询需要适当的权限才能执行
- 确保聚合函数(如SUM)适合您的数据类型
- 在使用百分比计算时注意除零错误
这篇文章详细介绍了SQL Server中透视表的基本概念和实际应用,从简单的数据转换到复杂的动态查询都有覆盖。通过这些示例,您可以更好地理解和使用PIVOT功能来进行数据分析。
如果你正在从事上位机、自动化、机器视觉、物联网(IOT)项目或数字化转型方面的工作,欢迎加入我的微信圈子!在这里,我们不仅可以轻松畅聊最新技术动态和行业趋势,还能够在技术问题上互相帮助和支持。我会尽量利用我的知识和经验来帮助你解决问题,当然也期待从大家的专业见解中学习和成长。无论你是新手还是老鸟,期待与志同道合的朋友交流心得,一起进步!
文章转载自技术老小子,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
391次阅读
2025-04-17 17:02:24
云和恩墨钟浪峰:安全生产系列之SQL优化安全操作
墨天轮编辑部
246次阅读
2025-03-31 11:08:20
Before & After:SQL整容级优化
薛晓刚
112次阅读
2025-04-14 22:08:44
SQL 优化之 OR 子句改写
xiongcc
99次阅读
2025-04-21 00:08:06
Mysql/Oracle/Postgresql快速批量生成百万级测试数据sql
hongg
78次阅读
2025-04-07 15:32:54
Oracle DBA 必备!这份高效运维的“秘籍”,高频实用 SQL 一网打尽
青年数据库学习互助会
64次阅读
2025-03-31 10:03:00
Oracle数据库常用脚本(七)
lh11811
59次阅读
2025-04-01 08:57:44
“G”术时刻:资深工程师揭秘GBase数据库Hint核心技巧 实现SQL性能跃升
GBASE数据库
54次阅读
2025-04-25 10:10:28
如何高效使用 Text to SQL 提升数据分析效率?四个关键应用场景解析
镜舟科技
47次阅读
2025-04-15 18:58:40
轻松上手 SQLynx:以 MySQL 为基础的安装与使用指南
K.
45次阅读
2025-04-21 00:32:59