日期:2014-05-17  浏览次数:20486 次

请教行转列,谢谢
公司 月份  人数  价格
a     1      2     5
a     2      3     3
b     1      3     5
b     1      3     5



公司   1月份人数 2月份人数  1月份价格 2月份价格
a       2            3        5         3
b       6            0        10         0

------解决方案--------------------

select 公司,
sum(case when 月份=1 then 人数 else 0 end)as 1月份人数,
sum(case when 月份=2 then 人数 else 0 end)as 2月份人数,
sum(case when 月份=1 then 价格 else 0 end)as 1月份价格,
sum(case when 月份=2 then 价格 else 0 end)as 2月份价格 
from 表名 group by 公司

------解决方案--------------------
USE test
GO

-->生成表tb

if object_id('tb') is not null 
drop table tb
Go
Create table tb([公司] nvarchar(1),[月份] smallint,[人数] smallint,[价格] smallint)
Insert into tb
Select N'a',1,2,5
Union all Select N'a',2,3,3
Union all Select N'b',1,3,5
Union all Select N'b',1,3,5




DECLARE @sql NVARCHAR(MAX)

SELECT @sql=ISNULL(@sql+',','')
+N'SUM(Case when [月份]='+LTRIM([月份])+N' Then [人数] Else 0 End) As [人数'+LTRIM([月份])+']'
FROM tb 
GROUP BY [月份]

SELECT @sql=ISNULL(@sql+',','')
+N'SUM(Case when [月份]='+LTRIM([月份])+N' Then [价格] Else 0 End) As [价格'+LTRIM([月份])+']'
FROM tb 
GROUP BY [月份]

Exec (N'Select [公司],'+@sql+N' From tb Group by [公司]')

/*
公司   人数1         人数2         价格1         价格2
---- ----------- ----------- ----------- -----------
a    2           3           5           3
b    6           0           10          0
*/