读书人

求SQL查询解决办法

发布时间: 2012-01-19 20:57:58 作者: rapoo

求SQL查询
表a, b, c

//表结构
a: 部门, 费用名称, 费用金额

//表记录
财务部, 工资, 100000
财务部, 交通费, 5000
采购部, 交通费, 1000
采购部, 工资, 20000

求: 将费用按部门统计出来

费用名称 财务部, 采购部, ..., 合计
工资 100000 20000 .... xxxxxxx
交通费 5000 1000 .... xxxxxxx
..............
合计 xxxxx xxxxx .... xxxxxxx

有好的方法吗?




[解决办法]

declare @sql varchar(8000)
set @sql= ' '

select @sql=@sql+ ',[ '+部门+ ']=sum(case 部门 when ' ' '+部门+ ' ' ' then 费用金额 else 0 end) '
from 表a group by 部门

set @sql= 'select 费用名称=isnull(费用名称, ' '合计 ' ') '+@sql+ ',合计=sum(费用金额) from 表a group by 费用名称 with rollup '

exec(@sql)
[解决办法]
create table A (部 varchar(20),[用名] varchar(20),金 int)

insert into A
select '部 ', '工 ',100000 union all
select '部 ', '交通 ',5000 union all
select '部 ', '工 ',1000 union all
select '部 ', '交通 ',500

declare @sql varchar(8000)
set @sql= ' '
select @sql=@sql+ ',sum(case when [部]= ' ' '+[部]+ ' ' ' then 金 else 0 end) as [ '+[部]+ '] '
from A group by [部]

set @sql= 'select [用名] '+@sql+ ' ,[合]=(select sum(金) from A where 用名=t.用名) from A t group by [用名] union all select ' '合 ' ', '+stuff(@sql,1,1, ' ')+ ' ,sum(金) from A '
exec(@sql)

drop table A


用名 部 部 合
-------------------- ----------- ----------- -----------
工 100000 1000 101000
交通 5000 500 5500
合 105000 1500 106500



[解决办法]
create table T(部门 varchar(20), 费用名称 varchar(20), 费用金额 int)
insert T select '财务部 ', '工资 ', 100000
union all select '财务部 ', '交通费 ', 5000
union all select '采购部 ', '交通费 ', 1000
union all select '采购部 ', '工资 ', 20000


declare @sql varchar(8000)
set @sql= 'select 费用名称, '
select @sql=@sql+quotename(部门)+ '=sum(case when 部门= '+quotename(部门, ' ' ' ')+ ' then 费用金额 else 0 end), '
from T
group by 部门
select @sql=@sql+ ' 合计=sum(费用金额) from T group by 费用名称 '
exec(@sql)

--result
费用名称 财务部 采购部 合计
-------------------- ----------- ----------- -----------
工资 100000 20000 120000
交通费 5000 1000 6000
[解决办法]
小弟不才,出来帮忙解释一下,说得不对,请扔砖头。~:)




一楼写的那不是存储过程,只是一段普通的sql代码,其意义在于先生成可以完成查询的语句的字符串,然后再执行这个字符串。

这个过程很多人称为拼动态sql语句

利用这种方法可以动态生成列名以及进行对行列的转换操作。

读书人网 >SQL Server

热点推荐