表a, b, c//表结构
a: 部门, 费用名称, 费用金额//表记录
财务部, 工资, 100000
财务部, 交通费, 5000
采购部, 交通费, 1000
采购部, 工资, 20000求: 将费用按部门统计出来费用名称 财务部, 采购部, ..., 合计
工资 100000 20000 .... xxxxxxx
交通费 5000 1000 .... xxxxxxx
..............
合计 xxxxx xxxxx .... xxxxxxx有好的方法吗?
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)
这是一个很常见的交叉表查询问题,用楼上的SQL应该可以解决。
------------------
哈哈~
select '財務部','工資',100000 union all
select '財務部','交通費',5000 union all
select '採購部','工資',1000 union all
select '採購部','交通費',500declare @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
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
AS
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)GO--用ADO來調用這個store procedure就可以了
一楼写的那不是存储过程,只是一段普通的sql代码,其意义在于先生成可以完成查询的语句的字符串,然后再执行这个字符串。这个过程很多人称为拼动态sql语句利用这种方法可以动态生成列名以及进行对行列的转换操作。
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(6000), @sql2 varchar(2000)
select @sql='select 费用名称, ', @sql2=' union all select ''合計'','
select @sql=@sql+quotename(部门)+'=sum(case when 部门='+quotename(部门, '''')+' then 费用金额 else 0 end),',
@sql2=@sql2+'sum(case when 部门='+quotename(部门, '''')+' then 费用金额 else 0 end),'
from T
group by 部门
select @sql=@sql+' 合计=sum(费用金额) from T group by 费用名称', @sql2=@sql2+' sum(费用金额) from T'
exec(@sql+@sql2)--result
费用名称 财务部 采购部 合计
-------------------- ----------- ----------- -----------
工资 100000 20000 120000
交通费 5000 1000 6000
合計 105000 21000 126000