当前位置: 代码迷 >> Sql Server >> 请问行转列语句,并且汇总,多谢
  详细解决方案

请问行转列语句,并且汇总,多谢

热度:80   发布时间:2016-04-24 11:04:39.0
请教行转列语句,并且汇总,谢谢
表内容  项目不确定有多少个 
表内容
公司 项目   价格    
a    房费   10     
a    房费   10     
a    车费   10     

b    车费   10     
b    车费   10     
b    门费   50     
生成内容
公司    房费        车费       门费      总计 
a          20           10             0          30        
b          0              20           50          70 

汇总     20          30            50         100 
------解决方案--------------------

   Declare @sql varchar(max)  
    set @sql=STUFF((select ','+QUOTENAME(project) from [Table_3] group by [project] FOR XML PATH('')) ,1,1,'')  
    set @sql='select * from [Table_3] t  
              pivot (sum([price])for [project] in ('+@sql+')) a '  
    exec(@sql)  

------解决方案--------------------
----------------------------------------------------------------
-- Author  :fredrickhu(小F,向高手学习)
-- Date    :2014-03-31 15:18:30
-- Verstion:
--      Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) 
-- Jul  9 2008 14:43:34 
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Enterprise Edition on Windows NT 6.1 <X86> (Build 7601: Service Pack 1)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go 
create table [tb]([公司] varchar(10),[项目] varchar(4),[价格] int)
insert [tb]
select 'a','房费',10 union all
select 'a','房费',10 union all
select 'a','车费',10 union all
select 'b','车费',10 union all
select 'b','车费',10 union all
select 'b','门费',50
--------------开始查询--------------------------
declare @sql varchar(8000)
set @sql = 'select isnull(公司,''汇总'')  as 公司 '
select @sql = @sql + ' , sum(case 项目 when ''' + 项目 + ''' then 价格 else 0 end) [' +  项目 + ']'
from (select distinct  项目 from tb) as a
set @sql = @sql + ',sum(价格) as 总计 from tb group by 公司 with rollup'
exec(@sql)
----------------结果----------------------------
/* 公司         车费          房费          门费          总计
---------- ----------- ----------- ----------- -----------
a          10          20          0           30
b          20          0           50          70
汇总         30          20          50          100

(3 行受影响)
*/
  相关解决方案