SQL Server 2005新功能之PIVOT的描述

以下的文章主要描述的是SQL Server 2005新功能之PIVOT,在工具的升级中,我个人认为首先我们的看看这个工具,其主要是在哪些功能上得到加强,所以今天我们就来看看SQL2005这个PIVOT吧。PIVOT 关系运算符对表值表达式进行操作以获得另一个表。

PIVOT 通过将表达式某一列中的唯一值转换为输出中的多个列来转换表。工具的升级,我以为得先看看这个工具在哪些功能上得到加强,今天我们就看看SQL2005这个PIVOT吧。PIVOT 关系运算符对表值表达式进行操作以获得另一个表。PIVOT 通过将表达式某一列中的唯一值转换为输出中的多个列来转换表值表达式,并在必要时对最终输出中所需的任何其余的列值执行聚合。

记得我们在SQL2000中要用聚合和CASE语句完成一个行列转换吧,特别当待转成列的数据不定时,我们往往构造动态SQL,然后用EXEC来运行。

 

环境准备:

 

  1. -- Author: happyflsytone   
  2. -- Version:V1.001   
  3. -- Date:2008-09-18 10:20:53   
  4. -- Test Data: ta   
  5. IF OBJECT_ID('ta') IS NOT NULL   
  6. DROP TABLE ta   
  7. ;   
  8. CREATE TABLE ta(id INT,col1 Nvarchar(2),col2 Nvarchar(2),col3 Nvarchar(4),col4 INT)   
  9. ;   
  10. INSERT INTO ta   
  11. SELECT 1,'HN','CS','abc',1 UNION ALL   
  12. SELECT 2,'HN','CS','abcd',2 UNION ALL   
  13. SELECT 3,'HN','CD','abcd' ,3UNION ALL   
  14. SELECT 4,'HN','HY','ae' ,4   
  15. ;   

我们先来回顾SQL2000的行列转换,比如我们对上例程把col3转列显示,并把col4的和当对应列值。我们分两种情况来讨论:

一、当col3的列值固定就是’abc’,’abcd’,’ae’三种情况

 

  1. SELECT   
  2. col1,   
  3. col2,   
  4. [abc] = SUM(CASE WHEN col3 = 'abc' THEN col4 ELSE 0 END),   
  5. [abcd] = SUM(CASE WHEN col3 = 'abcd' THEN col4 ELSE 0 END),   
  6. [ae] = SUM(CASE WHEN col3 = 'ae' THEN col4 ELSE 0 END)   
  7. FROM ta   
  8. GROUP BY col1,col2   
  9. /*   
  10. col1 col2 abc abcd ae   
  11. HN CD 0 3 0   
  12. HN CS 1 2 0   
  13. HN HY 0 0 4  

(3 行受影响)

 

二、当col3的列值不固定时就运用动态SQL,其实也就是构造一个sum(CASE WHEN …)SQL字符串

 

  1. DECLARE @s varchar(8000)   
  2. SELECT @s = isnull(@s+',   
  3. ','') +'['+col3+'] = SUM(CASE WHEN col3 = '''+col3+''' THEN col4 ELSE 0 END)'   
  4. FROM ( SELECT distinct col3 FROM ta) a   
  5. SET @s = 'SELECT   
  6. col1,   
  7. col2,   
  8. '+@s + '   
  9. FROM ta   
  10. GROUP BY   
  11. col1,col2'   
  12. EXEC(@s)   
  13. /*   
  14. col1 col2 abc abcd ae   
  15. HN CD 0 3 0   
  16. HN CS 1 2 0   
  17. HN HY 0 0 4  

(3 行受影响)

 

我们先输入这个@S看看是什么东东,只要加上print @s

 

  1. SELECT   
  2. col1,   
  3. col2,   
  4. [abc] = SUM(CASE WHEN col3 = 'abc' THEN col4 ELSE 0 END),   
  5. [abcd] = SUM(CASE WHEN col3 = 'abcd' THEN col4 ELSE 0 END),   
  6. [ae] = SUM(CASE WHEN col3 = 'ae' THEN col4 ELSE 0 END)   
  7. FROM ta   
  8. GROUP BY   
  9. col1,col2  

其实就是上面我们构造的固定列值的SQL嘛。

好,现在们开始在2005中实现这个功能,先来看看2005的FROM子句的定义(关于如何看这个定义请参照SQL2005的文档约定及Transate-SQL语法约定):

 

  1. [ FROM { <table_source> } [ ,...n ] ]   
  2. <table_source> ::=   
  3. {   
  4. <pivoted_table>   
  5. }   
  6. <pivoted_table> ::=   
  7. table_source PIVOT <pivot_clause> table_alias   
  8. <pivot_clause> ::=   
  9. ( aggregate_function ( value_column )   
  10. FOR pivot_column   
  11. IN ( <column_list> )   
  12. )   
  13. <column_list> ::=   
  14. column_name [ , ... ]   

pivot_column 和 value_column 是 PIVOT 运算符使用的组合列。PIVOT 遵循以下过程获得输出结果集:

对分组列的 input_table 执行 GROUP BY,为每个组生成一个输出行。

 

输出行中的分组列获得 input_table 中该组的对应列值。

 

通过执行以下操作,为每个输出行生成列列表中的列的值:

 

针对 pivot_column,对上一步在 GROUP BY 中生成的行另外进行分组。

 

对于 column_list 中的每个输出列,选择满足以下条件的子组:

 

  1. pivot_column = CONVERT(<data type of pivot_column>, 'output_column')  

针对此子组上的 aggregate_function 对 value_column 求值,其结果作为相应的 output_column 的值返回。如果该子组为空,SQL Server 2005 将为该 output_column 生成空值。如果聚合函数是 COUNT,且子组为空,则返回零 (0)。

 

接着我们利用我们开头的例子来理解一下这个FROM子句,很显然我们的col4对应上面的value_column,我们还假定列会下固定为这三项,那么列 col3 对应上面的pivot_column,进而我们应该得出[abc],[abcd],[ae]是column_name即我们的输出列,最后我们只要构造一下table_source就可以了,如何构造这个table_source,显然pivot_column 和 value_column应该包含在其中,其它就应该是你想要分组的列啦.

 

我们来总结一下:这个FROM子句是基于 table_source 对 pivot_column 进行透视,table_source 中 pivot_column 和 value_column 列之外的列被称为透视运算符的组合列,而PIVOT 是对输入表执行组合列的分组操作,并为每个组返回一行,好,我们试着写出这个SQL:

 

  1. SELECT col1,col2,[abc],[abcd],[ae]   
  2. FROM   
  3. (SELECT col1,col2,col3,col4   
  4. FROM ta ) p   
  5. PIVOT   
  6. ( SUM (col4)   
  7. FOR col3 IN ([abc],[abcd],[ae])   
  8. )AS unpvt  

我们执行一下看看结果:

  1. /*   
  2. col1 abc abcd ae  

以上的相关内容就是对SQL Server 2005 的新功能的介绍,望你能有所收获。

【编辑推荐】

  1. SQL Server行转列的什么情况下被用?
  2. SQL Server获取表的容量很简单!
  3. SQL Server排序遇到NULL,不怕不帕!
  4. SQL Server 2005两种快照隔离机制的不同之处
  5. SQL Server 2008 FileStream支持“真功夫版”

 

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/226327.html<

(0)
运维的头像运维
上一篇2025-04-17 07:50
下一篇 2025-04-17 07:51

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注