PIVOT 用于将列值旋转为列名

PIVOT 用于将列值旋转为列名(即行转列),在 SQL Server 2000可以用聚合函数配合CASE语句实现

PIVOT 的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P

注意:PIVOT、UNPIVOT是SQL Server 2005 的语法,使用需修改数据库兼容级别(在数据库属性->选项->兼容级别改为   90 )

SQL2008 中可以直接使用

完整语法:

 

UNPIVOT 用于将列明转为列值(即列转行),在SQL Server 2000可以用UNION来实现

 

典型实例

一、行转列

1、建立表格

IF OBJECT_ID(‘tb‘) IS NOT NULL DROP TABLE tb

go

CREATE TABLE tb(姓名 VARCHAR(10),课程 VARCHAR(10),分数 INT)

insert into tb VALUES (‘张三‘,‘语文‘,74)
insert into tb VALUES (‘张三‘,‘数学‘,83)
insert into tb VALUES (‘张三‘,‘物理‘,93)
insert into tb VALUES (‘李四‘,‘语文‘,74)
insert into tb VALUES (‘李四‘,‘数学‘,84)
insert into tb VALUES (‘李四‘,‘物理‘,94)

go

SELECT * FROM tb

go

姓名       课程       分数

---------- ---------- -----------

张三       语文        74

张三       数学        83

张三       物理        93

李四       语文        74

李四       数学        84

李四       物理        94

2、使用SQL Server 2000静态SQL

 

3、使用SQL Server 2000动态SQL

--SQL SERVER 2000动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)

--变量按sql语言顺序赋值

[email protected](500)

[email protected]=‘select姓名‘

[email protected][email protected]+‘,max(case课程when ‘‘‘+课程+‘‘‘ then分数else 0 end)[‘+课程+‘]‘

from(selectdistinct课程fromtb)a--同from tb group by课程,默认按课程名排序

[email protected][email protected]+‘ from tb group by姓名‘

exec(@sql)

--使用isnull(),变量先确定动态部分

[email protected](8000)

[email protected]=isnull(@sql+‘,‘,‘‘)+‘ max(case课程when ‘‘‘+课程+‘‘‘ then分数else 0 end) [‘+课程+‘]‘

from(selectdistinct课程fromtb)asa      

[email protected]=‘select姓名,‘[email protected]+‘ from tb group by姓名‘

exec(@sql)

4、使用SQL Server 2005静态SQL

SELECT * FROM tb pivot( MAX(分数) FOR 课程 IN (语文,数学,物理))a

姓名       语文        数学        物理

---------- ----------- ----------- -----------

李四        74          84          94

张三        74          83          93

5、使用SQL Server 2005动态SQL

--使用stuff()

DECLARE @sql VARCHAR(8000)

SET @sql=‘‘  --初始化变量 @sql

SELECT @sql= @sql+‘,‘ + 课程 FROM tb GROUP BY 课程 --变量多值赋值

SET @sql= STUFF(@sql,1,1,‘‘)--去掉首个‘,‘

SET @sql=‘select * from tb pivot (max(分数) for 课程 in (‘[email protected]+‘))a‘

PRINT @sql

exec(@sql)

--或使用isnull()

DECLARE @sql VARCHAR(8000)

--获得课程集合

SELECT @sql= ISNULL(@sql+‘,‘,‘‘)+课程 FROM tb
GROUP BY 课程           

SET @sql=‘select * from tb pivot (max(分数) for 课程 in (‘[email protected]+‘))a‘

exec(@sql)

二、行转列结果加上总分、平均分

1、使用SQL Server 2000静态SQL

 

姓名       语文        数学        物理        总分        平均分

---------- ----------- ----------- ----------- -----------

李四        74          84          94          252         84.00

张三        74          83          93          250         83.33

2、使用SQL Server 2000动态SQL

 

3、使用SQL Server 2005静态SQL

SELECT  m.* ,
        n.总分 ,
        n.平均分
FROM    ( SELECT    *
          FROM      tb PIVOT( MAX(分数) FOR 课程 IN ( 语文, 数学, 物理 ) ) a
        ) m ,
        ( SELECT    姓名 ,
                    SUM(分数) 总分 ,
                    CAST(AVG(分数 * 1.0) AS DECIMAL(18, 2)) 平均分
          FROM      tb
          GROUP BY  姓名
        ) n
WHERE   m.姓名 = n.姓名

4、使用SQL Server 2005动态SQL

 

二、列转行

1、建立表格

IF OBJECT_ID(‘tb‘) IS NOT NULL DROP TABLE tb
go

CREATE TABLE tb(姓名 VARCHAR(10),语文 INT,数学 INT,物理 INT)

INSERT INTO tb VALUES(‘张三‘,74,83,93)

INSERT INTO tb VALUES(‘李四‘,74,84,94)

go

SELECT * FROM tb

姓名       语文        数学        物理

---------- ----------- ----------- -----------

张三       74          83          93

李四        74          84          94

2、使用SQL Server 2000静态SQL

 

姓名       课程 分数

---------- ---- -----------

李四       语文 74

李四       数学 84

李四       物理 94

张三       语文 74

张三       数学 83

张三       物理 93

2、使用SQL Server 2000动态SQL

 

3、使用SQL Server 2005静态SQL

--SQL SERVER 2005动态SQL

SELECT  姓名 ,
        课程 ,
        分数
FROM    tb UNPIVOT ( 分数 FOR 课程 IN ( [语文], [数学], [物理] ) ) t 

4、使用SQL Server 2005动态SQL

--SQL SERVER 2005动态SQL

DECLARE @sql NVARCHAR(4000)

SELECT  @sql = ISNULL(@sql + ‘,‘, ‘‘) + QUOTENAME(name)
FROM    syscolumns
WHERE   id = OBJECT_ID(‘tb‘)
        AND name NOT IN ( ‘姓名‘ )
ORDER BY colid

SET @sql = ‘select 姓名,[课程],[分数] from tb unpivot ([分数] for [课程] in(‘ + @sql
    + ‘))b‘

EXEC(@sql)
时间: 2024-08-29 01:40:31

PIVOT 用于将列值旋转为列名的相关文章

SqlServer行转列(PIVOT),列转行(UNPIVOT)总结

PIVOT用于将列值旋转为列名(即行转列) 语法: table_source PIVOT( 聚合函数(value_column) FOR pivot_column IN(<column_list>) ) UNPIVOT用于将列明转为列值(即列转行) 语法: table_source UNPIVOT( value_column FOR pivot_column IN(<column_list>) ) 注意:PIVOT.UNPIVOT是SQL Server 2005的语法,使用需修改数

Sqlserver中PIVOT行转列透视操作

创建表: IF OBJECT_ID('T040_PRODUCT_SALES') IS NOT NULL DROP TABLE T040_PRODUCT_SALES create table T040_PRODUCT_SALES ( ID INT IDENTITY(1,1), ProductName VARCHAR(20), SaleMonth INT, SalesCount INT ) 插入数据并排序: INSERT INTO T040_PRODUCT_SALES VALUES ('Bicycl

ASP.new GridView获取隐藏列值的几种方法

解决方法: 原文来自:http://www.tzwhx.com/NewShow/newBodyShow/控件_32933.html 作者:lerit  1.隐藏列前获取数据 看这样一个例子(以下均以此为例):用户选择一些查询条件后,点击"查询"按钮.后台需要根据每行中第六列的值是否为1,来设置第三个单元格的背景色为红色. 这种方法中,后台是在按钮的Click事件中,去数据库取记录,然后得到DataTable,最后将它绑定到GridView中.如果我们需要在GridView的RowDat

SQL Server 2008 R2——PIVOT 行转列 以及聚合函数的选择

原文:SQL Server 2008 R2--PIVOT 行转列 以及聚合函数的选择 ==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完整性. 未经作者同意请勿修改(包括本声明),保留法律追究的权利. 未经作者同意请勿用于学术性引用. 未经作者同意请勿用于商业出版.商业印刷.商业引用. 本文不定期修正完善,为保证内容正确,建议移步原文处阅读. 本文

mysql 清空或删除表数据后,控制表自增列值的方法

http://blog.sina.com.cn/s/blog_68431a3b0100y04v.html 方法1: truncate table 你的表名 //这样不但将数据全部删除,而且重新定位自增的字段 方法2: delete from 你的表名 dbcc checkident(你的表名,reseed,0) //重新定位自增的字段,让它从1开始 方法3: 如果你要保存你的数据,介绍你第三种方法,by QINYI 用phpmyadmin导出数据库,你在里面会有发现哦 编辑sql文件,将其中的自

Oracle查询结果列的加减、求和、连接、列值相乘

select prod.amount,prod.plansum,(prod.plansum-prod.amount) as borrow,d.enum_value from ----结果集相减(select t.Quo_Prod_List_Price * t.QUO_PROD_VOLUME as amount ,----列值相乘       t.quo_prod_plan_cost * t.quo_prod_volume as plansum , t.broad_class as broad_c

T-Sql语法:行转列(pivot)和列转行(unpivot)

在不知道PIVOT关系运算符的用法之前,我们通过聚合函数配合CASE--WHEN的写法来实现相应的功能,微软在Sql Server 2005以及更高版本中提供能PIVOT关系运算符,POVIT提供的语法比一系列的SELECT--CASE语句中所指定的语法更简单和更具可读性. POVIT的完整语法: table_source PIVOT(聚合函数(<value_column>) FOR pivot_column IN(<pivot_column_list>))  as <piv

sqlserver报表统计——参数化动态PIVOT行转列

先列出所有表结构: --title 报表 --table 实收水费:hx_t_received --字段 收费部门id:hx_fdepartmentid 1.收费部门名称:hx_fdepartmentname 应收水费信息ID:hx_freceivableid --收费类别:hx_ftype (水费(1):再分[开户(table) 供水类别:自来水(100000001)==水费,中水(100000002)==中水费],代理费(2)==污水处理费) --实收金额:hx_freceivedamoun

&lt;原创&gt;两个数字列号转字母列名的小程序

我在工作中遇到一个问题,在编写excel宏代码的时候,有时候,某一个数据需要定位放在某一个单元格中,但是这个单元格并不是本身就存在的单元格,而是在程序执行过程中,一步一步填写数据之后生成出来的单元格,只知道应该是第几列,却不知道列名字母是什么,所以,我就编写了下面的小程序,两个小程序的效果一样,只不过在编写思路上有差别. 这两个小程序都采用了函数的方式,方便在其他的程序中调用. Function ColNoToColName1(ColNo As Integer) As String  '列号转为