日期:2014-05-18  浏览次数:20544 次

求行转列数句.
科室,   费用类别,   费用
语文科,   书本费,   20
物理科,   文具费,   30
语文科,   文具费,   50
语文科,   伙食费,   100
物理科,   餐费,       200

出来报表如下
科室,   文具费,伙食费,餐费,书本费       合计
语文科,50         100                     20               170
物理科   30                       200                         230



------解决方案--------------------
if object_id( 'pubs..tb ') is not null
drop table tb
go

create table tb(科室 varchar(10), 费用类别 varchar(10), 费用 int)
insert into tb(科室, 费用类别, 费用) values( '语文科 ', '书本费 ', 20)
insert into tb(科室, 费用类别, 费用) values( '物理科 ', '文具费 ', 30)
insert into tb(科室, 费用类别, 费用) values( '语文科 ', '文具费 ', 50)
insert into tb(科室, 费用类别, 费用) values( '语文科 ', '伙食费 ', 100)
insert into tb(科室, 费用类别, 费用) values( '物理科 ', '餐费 ', 200)
go
declare @sql varchar(8000)
set @sql = 'select 科室 '
select @sql = @sql + ' , sum(case 费用类别 when ' ' ' + 费用类别 + ' ' ' then 费用 else 0 end) [ ' + 费用类别 + '] '
from (select distinct 费用类别 from tb) as a
set @sql = @sql + ' ,sum(费用) 合计 from tb group by 科室 '
exec(@sql)

drop table tb
/*
科室 餐费 伙食费 书本费 文具费 合计
---------- ----------- ----------- ----------- ----------- -----------
物理科 200 0 0 30 230
语文科 0 100 20 50 170

*/
------解决方案--------------------
create table T(科室 nvarchar(10),费用类别 nvarchar(10),费用 int)
insert T select '语文科 ', '书本费 ', 20
insert T select '物理科 ', '文具费 ', 30
insert T select '语文科 ', '文具费 ', 50
insert T select '语文科 ', '伙食费 ', 100
insert T select '物理科 ', '餐费 ', 200

select 科室,
书本费=sum(case when 费用类别= '书本费 ' then 费用 else 0 end),
文具费=sum(case when 费用类别= '文具费 ' then 费用 else 0 end),
伙食费=sum(case when 费用类别= '伙食费 ' then 费用 else 0 end),
餐费=sum(case when 费用类别= '餐费 ' then 费用 else 0 end),
合计=(select sum(费用) from T where 科室=tmp.科室)
from T as tmp
group by 科室

--result
科室 书本费 文具费 伙食费 餐费 合计
---------- ----------- ----------- ----------- ----------- -----------
物理科 0 30 0 200 230
语文科 20 50 100 0 170

(2 row(s) affected)
------解决方案--------------------
create table t(xh varchar(20),kc varchar(20),cj int)
insert t select '051000333 ', '高等数学 ',55
union all select '051000333 ', '大学语文 ',67
union all select '051000333 ', '经济学基础 ',88
union all select '021000224 ', '高等数学 ',64
union all select '021000224 ', '大学语文 ',32
union all select '021000224 ', '经济学基础 ',75
union all select '041000851 ', '高等数学 ',69
union all select '041000851 ', '大学语文 ',75
union all select '041000851 ', '经济学基础 ',65


declare @sql va