您的位置:首页 > 数据库

Sql server pivot应用 行列转换

2010-07-01 09:08 513 查看
行列转换必须要有聚合函数。

create table testpivot(id int,[name] varchar(20),quarter int,profile int)

insert into testpivot values(1,'a',1,1000)

insert into testpivot values(1,'a',2,2000)

insert into testpivot values(1,'a',3,4000)

insert into testpivot values(1,'a',4,5000)

insert into testpivot values(2,'b',1,3000)

insert into testpivot values(2,'b',2,3500)

insert into testpivot values(2,'b',3,4200)

insert into testpivot values(2,'b',4,5500)

select * from testpivot

id          name                 quarter     profile

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

1           a                    1           1000

1           a                    2           2000

1           a                    3           4000

1           a                    4           5000

2           b                    1           3000

2           b                    2           3500

2           b                    3           4200

2           b                    4           5500

select id,name,

[1] as "一季度",

[2] as "二季度",

[3] as "三季度",

[4] as "四季度"

from

testpivot

pivot

(

sum(profile)

for quarter in

([1],[2],[3],[4])

) as pvt

id          name                 一季度         二季度         三季度         四季度

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

1           a                    1000        2000        4000        5000

2           b                    3000        3500        4200        5500

 

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 姓名,

max(case 课程 when '语文'then 分数 else 0 end) 0 as 语文,

max(case 课程 when '数学'then 分数 else 0 end) as 数学,

max(case 课程 when '物理'then 分数 else 0 end) as 物理

from tb group by 姓名

 

方法二:

select * from tb

select 姓名,语文,数学,物理

from tb

pivot(

max(分数)

for 课程 in (语文,数学,物理)

) as pvt

方法三:动态sql 实现方法一

 

declare @sql nvarchar(4000)

set @sql='Select 姓名 '

Select @sql=@sql+',sum(case when 课程='''+课程+ ''' then 分数 else 0 end) As '''+课程+''''

   From tb Group By 课程

Print @sql

set @sql=@sql+' From tb Group By 姓名'

Print @sql

execute sp_executesql @sql

方法四:动态sql实现方法二

declare @kc nvarchar(100)

select @kc =isnull(@kc+',','') +课程 from tb group by 课程

declare @sql nvarchar(1000)

set @sql=' select 姓名'

select @sql=@sql+','+课程+' '+''

from tb group by 课程

set @sql=@sql+'from tb

pivot(

max(分数)

for 课程 in ('+@kc+')

) as pvt'

print @kc

print @sql

execute sp_executesql @sql

 

USE AdventureWorks

GO

-- Creating Test Table

CREATE TABLE Product(Cust VARCHAR(25), Product VARCHAR(20), QTY INT)

GO

-- Inserting Data into Table

INSERT INTO Product(Cust, Product, QTY)

VALUES('KATE','VEG',2)

INSERT INTO Product(Cust, Product, QTY)

VALUES('KATE','SODA',6)

INSERT INTO Product(Cust, Product, QTY)

VALUES('KATE','MILK',1)

INSERT INTO Product(Cust, Product, QTY)

VALUES('KATE','BEER',12)

INSERT INTO Product(Cust, Product, QTY)

VALUES('FRED','MILK',3)

INSERT INTO Product(Cust, Product, QTY)

VALUES('FRED','BEER',24)

INSERT INTO Product(Cust, Product, QTY)

VALUES('KATE','VEG',3)

GO

-- Selecting and checking entires in table

SELECT *

FROM Product

GO

-- Selecting and checking entires in table

Cust Product QTY

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

KATE VEG 2

KATE SODA 6

KATE MILK 1

KATE BEER 12

FRED MILK 3

FRED BEER 24

KATE VEG 3

-- Pivot Table ordered by PRODUCT

SELECT PRODUCT, FRED, KATE

FROM (

SELECT CUST, PRODUCT, QTY

FROM Product) up

PIVOT (SUM(QTY) FOR CUST IN (FRED, KATE)) AS pvt

ORDER BY PRODUCT

GO

-- Pivot Table ordered by PRODUCT

PRODUCT FRED KATE

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

BEER 24 12

MILK 3 1

SODA NULL 6

VEG NULL 5

-- Pivot Table ordered by CUST

SELECT CUST, VEG, SODA, MILK, BEER, CHIPS

FROM (

SELECT CUST, PRODUCT, QTY

FROM Product) up

PIVOT (SUM(QTY) FOR PRODUCT IN (VEG, SODA, MILK, BEER, CHIPS)) AS pvt

ORDER BY CUST

-- Pivot Table ordered by CUST

CUST VEG SODA MILK BEER CHIPS

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

FRED NULL NULL 3 24 NULL

KATE 5 6 1 12 NULL

GO

-- Unpivot Table ordered by CUST

SELECT CUST, PRODUCT, QTY

FROM

(

SELECT CUST, VEG, SODA, MILK, BEER, CHIPS

FROM (

SELECT CUST, PRODUCT, QTY

FROM Product) up

PIVOT

( SUM(QTY) FOR PRODUCT IN (VEG, SODA, MILK, BEER, CHIPS)) AS pvt) p

UNPIVOT

(QTY FOR PRODUCT IN (VEG, SODA, MILK, BEER, CHIPS)

) AS Unpvt

GO

-- Unpivot Table ordered by CUST

CUST PRODUCT QTY

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

FRED MILK 3

FRED BEER 24

KATE VEG 5

KATE SODA 6

KATE MILK 1

KATE BEER 12 12

-- Clean up database

DROP TABLE Product

GO
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: