欢迎光临优选殡葬网
详情描述

一、使用 PIVOT 运算符(SQL Server 2005+)

1. 基础语法

SELECT [非透视列],
       [透视值1] AS [列名1],
       [透视值2] AS [列名2],
       ...
FROM 
    (SELECT [列] FROM [表]) AS 源表
PIVOT
    (
    聚合函数(被聚合列)
    FOR [透视列] IN ([透视值1], [透视值2], ...)
    ) AS 透视表

2. 示例

假设有以下销售数据:

CREATE TABLE Sales (
    SalesPerson VARCHAR(50),
    Product VARCHAR(50),
    Amount DECIMAL(10,2)
);

INSERT INTO Sales VALUES
('张三', '手机', 1000),
('张三', '电脑', 2000),
('李四', '手机', 1500),
('李四', '平板', 1200),
('王五', '电脑', 1800);

行转列查询:

SELECT SalesPerson,
       ISNULL([手机], 0) AS 手机,
       ISNULL([电脑], 0) AS 电脑,
       ISNULL([平板], 0) AS 平板
FROM 
    (SELECT SalesPerson, Product, Amount 
     FROM Sales) AS SourceTable
PIVOT
    (
    SUM(Amount)
    FOR Product IN ([手机], [电脑], [平板])
    ) AS PivotTable;

二、使用 CASE WHEN 语句(兼容性好)

1. 基本语法

SELECT 
    [分组列],
    SUM(CASE WHEN [条件列] = '值1' THEN [数值列] ELSE 0 END) AS 列名1,
    SUM(CASE WHEN [条件列] = '值2' THEN [数值列] ELSE 0 END) AS 列名2,
    ...
FROM [表名]
GROUP BY [分组列]

2. 示例

SELECT 
    SalesPerson,
    SUM(CASE WHEN Product = '手机' THEN Amount ELSE 0 END) AS 手机,
    SUM(CASE WHEN Product = '电脑' THEN Amount ELSE 0 END) AS 电脑,
    SUM(CASE WHEN Product = '平板' THEN Amount ELSE 0 END) AS 平板
FROM Sales
GROUP BY SalesPerson;

三、动态 PIVOT(列值不固定时)

1. 动态生成SQL

DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);

-- 获取不重复的列值
SELECT @columns = STRING_AGG(QUOTENAME(Product), ',')
FROM (SELECT DISTINCT Product FROM Sales) AS T;

-- 构造动态SQL
SET @sql = N'
SELECT SalesPerson, ' + @columns + '
FROM 
    (SELECT SalesPerson, Product, Amount FROM Sales) AS SourceTable
PIVOT
    (
    SUM(Amount)
    FOR Product IN (' + @columns + ')
    ) AS PivotTable';

-- 执行
EXEC sp_executesql @sql;

2. 兼容旧版本的写法(SQL Server 2017之前)

DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);

SELECT @columns = STUFF(
    (SELECT DISTINCT ',' + QUOTENAME(Product)
     FROM Sales
     FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '');

SET @sql = 'SELECT SalesPerson, ' + @columns + '
           FROM Sales
           PIVOT (
               SUM(Amount)
               FOR Product IN (' + @columns + ')
           ) AS PivotTable';

EXEC sp_executesql @sql;

四、使用 STRING_AGG + JSON(SQL Server 2016+)

SELECT SalesPerson,
       JSON_VALUE(pivot_data, '$.手机') AS 手机,
       JSON_VALUE(pivot_data, '$.电脑') AS 电脑,
       JSON_VALUE(pivot_data, '$.平板') AS 平板
FROM (
    SELECT SalesPerson,
           (SELECT Product, SUM(Amount) as Amount
            FROM Sales s2
            WHERE s2.SalesPerson = s1.SalesPerson
            GROUP BY Product
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER) as pivot_data
    FROM Sales s1
    GROUP BY SalesPerson
) AS t;

五、性能优化建议

索引优化:为透视列和分组列创建合适的索引

CREATE INDEX IX_Sales_Product ON Sales(Product, SalesPerson) INCLUDE (Amount);

处理NULL值:使用 ISNULL 或 COALESCE 处理空值

SELECT SalesPerson,
       ISNULL([手机], 0) AS 手机,
       COALESCE([电脑], 0) AS 电脑
FROM ...

数据类型匹配:确保聚合列的数据类型一致

六、选择建议

方法 适用场景 优点 缺点
PIVOT 运算符 列值固定且已知 语法简洁,易于理解 列值必须静态指定
CASE WHEN 简单转换,兼容性好 灵活性高,兼容所有版本 代码较冗长
动态 PIVOT 列值不固定 自动处理变化的列值 需要动态SQL,安全性需注意
JSON 方法 复杂嵌套结构 处理复杂数据结构 性能可能较差

七、实际应用示例

多列透视:

-- 同时透视产品和季度
SELECT SalesPerson, Product,
       ISNULL([Q1], 0) AS Q1,
       ISNULL([Q2], 0) AS Q2,
       ISNULL([Q3], 0) AS Q3,
       ISNULL([Q4], 0) AS Q4
FROM 
    (SELECT SalesPerson, Product, Quarter, Amount 
     FROM SalesWithQuarter) AS SourceTable
PIVOT
    (
    SUM(Amount)
    FOR Quarter IN ([Q1], [Q2], [Q3], [Q4])
    ) AS PivotTable;

根据具体需求选择合适的方法,动态PIVOT适合列值不确定的场景,而静态PIVOT或CASE WHEN在列值固定时更加直观。

相关帖子
不同地区与文化中,关于火葬和土葬的传统习俗有哪些值得了解的差异?
不同地区与文化中,关于火葬和土葬的传统习俗有哪些值得了解的差异?
2026年最新政策下,个人生育津贴的具体计算方法和步骤是什么?
2026年最新政策下,个人生育津贴的具体计算方法和步骤是什么?
许昌市网站优化推广服务公司-购物网站开发,网站制作
许昌市网站优化推广服务公司-购物网站开发,网站制作
许昌市短视频推广#网站开发本地公司,小程序开发
许昌市短视频推广#网站开发本地公司,小程序开发
申报和享受棉花目标价格补贴,需要具体满足哪些资格条件和种植要求?
申报和享受棉花目标价格补贴,需要具体满足哪些资格条件和种植要求?
许昌市白事服务-陵园丧葬服务,专业的团队
许昌市白事服务-陵园丧葬服务,专业的团队
张掖市企业网站建设开发-外贸网站建设,提供一站式建站服务
张掖市企业网站建设开发-外贸网站建设,提供一站式建站服务
南平市网站SEO优化#网站搭建服务,收费透明
南平市网站SEO优化#网站搭建服务,收费透明
果洛殡葬服务价格|白事服务公司,追悼会殡礼
果洛殡葬服务价格|白事服务公司,追悼会殡礼
长沙市丧葬服务办理-白事悼念会服务,正规专业
长沙市丧葬服务办理-白事悼念会服务,正规专业
在补办身份证期间,急需乘坐高铁或住酒店,应该办理什么临时证件?
在补办身份证期间,急需乘坐高铁或住酒店,应该办理什么临时证件?
2026年,劳动者被辞退时,经济补偿金的N究竟应该如何计算?
2026年,劳动者被辞退时,经济补偿金的N究竟应该如何计算?
5G套餐普及后,降档到4G套餐是否还能满足日常的社交与娱乐需求?
5G套餐普及后,降档到4G套餐是否还能满足日常的社交与娱乐需求?
2026年去派出所开具户籍证明,整个流程通常需要花费多长时间?
2026年去派出所开具户籍证明,整个流程通常需要花费多长时间?
身份证丢失后,是否会直接影响名下绑定的银行卡和手机卡安全?
身份证丢失后,是否会直接影响名下绑定的银行卡和手机卡安全?
唐山市苹果系统app开发#商城网站开发建设,专业建站公司
唐山市苹果系统app开发#商城网站开发建设,专业建站公司
如何帮助孩子在课后服务时段与不同年级的同学进行良性的互动和共同学习?
如何帮助孩子在课后服务时段与不同年级的同学进行良性的互动和共同学习?
家用电器待机功耗不容小觑,如何彻底关闭这些“隐形”的电能消耗?
家用电器待机功耗不容小觑,如何彻底关闭这些“隐形”的电能消耗?
乌鲁木齐市独立网站制作-精准获客引流,模板建站
乌鲁木齐市独立网站制作-精准获客引流,模板建站
2026年,我们普通人可以通过哪些日常小事为保护野生动物贡献力量?
2026年,我们普通人可以通过哪些日常小事为保护野生动物贡献力量?
沈阳市殡仪服务公司,殡葬服务车出租,全城服务
沈阳市殡仪服务公司,殡葬服务车出租,全城服务