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
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
相关文章推荐
- Sql Server 2005 PIVOT的行列转换应用实例
- SQL Server中行列转换 Pivot UnPivot
- SQL Server 行列转换 Pivot UnPivot
- SQL Server中行列转换 Pivot UnPivot
- SQL Server中行列转换 Pivot UnPivot
- SQL Server中行列转换 Pivot UnPivot
- SQL Server中行列转换 Pivot UnPivot
- SQL Server中行列转换 Pivot UnPivot---收藏学习
- SQL Server中行列转换 Pivot UnPivot
- SQL Server中行列转换 Pivot UnPivot
- sql server(PIVOT) 行列转换 .
- SQL Server中行列转换 Pivot UnPivot
- SQL Server 行列相互转换命令:PIVOT和UNPIVOT使用详解
- T-SQL Pivot Tables(行列转换) in SQL Server 2005/2008
- SQL Server中行列转换 Pivot UnPivot
- SQL Server 2005之PIVOT/UNPIVOT行列转换
- SQL Server 2005之PIVOT/UNPIVOT行列转换(转)
- SQL Server 中行列转换 Pivot UnPivot
- 浅析SQL语句行列转换的两种方法 case...when与pivot函数的应用
- SQL Server中行列转换 Pivot UnPivot