原表:-----------------------------------代码 费用类别 数量 金额
001 a 100 200
001 b 110 320
002 a 20 120
003 a 10 90
004 b 20 100
......
期望得到如下结果:-----------------------------代码 费用类型a_数量 费用类别a_金额 费用类别b_数量 费用类别b_金额 ......
001 100 200 110 320
002 110 320
003 10 90
004 20 100
001 a 100 200
001 b 110 320
002 a 20 120
003 a 10 90
004 b 20 100
......
期望得到如下结果:-----------------------------代码 费用类型a_数量 费用类别a_金额 费用类别b_数量 费用类别b_金额 ......
001 100 200 110 320
002 110 320
003 10 90
004 20 100
(代码 Varchar(6),
费用类别 Varchar(5),
数量 Int,
金额 Int)
Insert TEST Select '001', 'a', 100, 200
Union All Select '001', 'b', 110, 320
Union All Select '002', 'a', 20, 120
Union All Select '003', 'a', 10, 90
Union All Select '004', 'b', 20, 100
Go
Declare @S Varchar(1000)
Set @S=''
Select @S=@S+',SUM(Case 费用类别 When '''+费用类别+''' Then 数量 Else 0 End) As 费用类型'+费用类别+'_数量' From (Select Distinct 费用类别 From TEST) A Order By 费用类别
Select @S=@S+',SUM(Case 费用类别 When '''+费用类别+''' Then 金额 Else 0 End) As 费用类型'+费用类别+'_金额' From (Select Distinct 费用类别 From TEST) A Order By 费用类别
Set @S='Select 代码'+@S+' From TEST Group By 代码 Order By 代码'
EXEC(@S)
GO
DECLARE @s varchar(8000)
SET @s = ''
SELECT @s = @s
+ ',' + QUOTENAME('费用类型' + 费用类别 + '_数量')
+ ' = SUM(CASE 费用类别 WHEN ' + QUOTENAME(费用类别, '''')
+ ' THEN 数量 ELSE 0 END)'
+ ',' + QUOTENAME('费用类型' + 费用类别 + '_金额')
+ ' = SUM(CASE 费用类别 WHEN ' + QUOTENAME(费用类别, '''')
+ ' THEN 金额 ELSE 0 END)'
FROM(
SELECT DISTINCT 费用类别 FROM 原表
)A
EXEC('
SELECT 代码'+@s+'
FROM 原表
GROUP BY 代码')
Create Table TEST
(代码 Varchar(6),
费用类别 Varchar(5),
数量 Int,
金额 Int)
Insert TEST Select '001', 'a', 100, 200
Union All Select '001', 'b', 110, 320
Union All Select '002', 'a', 20, 120
Union All Select '003', 'a', 10, 90
Union All Select '004', 'b', 20, 100
Go
Declare @S Nvarchar(1000)
Set @S=''
Select @S=@S+N',SUM(Case 费用类别 When '''+费用类别+N''' Then 数量 Else 0 End) As 费用类型'+费用类别+N'_数量,SUM(Case 费用类别 When '''+费用类别+N''' Then 金额 Else 0 End) As 费用类型'+费用类别+N'_金额' From TEST Group By 费用类别 Order By 费用类别
Set @S=N'Select 代码'+@S+N' From TEST Group By 代码 Order By 代码'
EXEC(@S)
GO
Drop Table TEST