首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

行转列语气,先多谢

2013-01-12 
行转列语气,先谢谢表内容项目不确定有多少个 表内容公司 项目金额a房费100a房费100a车费100b车费100b车费1

行转列语气,先谢谢
表内容  项目不确定有多少个 
表内容
公司 项目   金额
a    房费   100
a    房费   100
a    车费   100
b    车费   100
b    车费   100
b    门费   500
生成内容
公司  房费  车费 门费 汇总
a     200    100  0    300
b     0     200  500   700

注意:项目不确定有多少个
[解决办法]

if object_id('[TB]') is not null drop table [TB]
go
create table [TB] (公司 nvarchar(2),项目 nvarchar(4),金额 int)
insert into [TB]
select 'a','房费',100 union all
select 'a','房费',100 union all
select 'a','车费',100 union all
select 'b','车费',100 union all
select 'b','车费',100 union all
select 'b','门费',500

select * from [TB]


declare @s nvarchar(4000)
set @s=''
Select     @s=@s+','+quotename(项目)+'=sum(case when [项目]='+quotename(项目,'''')+' then [金额] else 0 end)'
from TB group BY 项目
exec('select [公司]'+@s+',[总成绩]=sum([金额])  from TB group by [公司]')

/*
公司车费房费门费总成绩
a1002000300
b2000500700*/

[解决办法]
USE test
GO
  
  
-->生成表tb
  
if object_id('tb') is not null 
    drop table tb
Go
Create table tb([公司] nvarchar(1),[项目] nvarchar(2),[金额] smallint)
Insert into tb
Select N'a',N'房费',100
Union all Select N'a',N'房费',100
Union all Select N'a',N'车费',100
Union all Select N'b',N'车费',100
Union all Select N'b',N'车费',100
Union all Select N'b',N'门费',500
 
 
DECLARE 
    @Project_pivot NVARCHAR(MAX)
    ,@Project_col NVARCHAR(MAX)
    ,@sql NVARCHAR(MAX)
 
SELECT @Project_pivot=ISNULL(@Project_pivot+',','')+QUOTENAME([项目]) FROM tb GROUP BY [项目]
SELECT @Project_col=ISNULL(@Project_col+',','')+'ISNULL('+QUOTENAME([项目])+',0) As '+QUOTENAME([项目]) FROM tb GROUP BY [项目]
 
EXEC (N'Select *,(Select Sum([金额]) From tb As o Where o.公司=t.公司) As 汇总 From (Select 公司,'+@Project_col+N' From tb As a Pivot (Sum([金额]) For [项目] In('+@Project_pivot+')) p) As t')
 
/*
公司   房费      车费        门费        汇总
---- ----------- ----------- ----------- -----------
a    200         100         0           300
b    0           200         500         700


 
*/

热点排行