那就需要与部门表进行表连接,对部门表中的所有部门进行费用汇总.类似这样:
select 部门表.部门, ----使用部门表中的部门,而不使用数据表中的部门
材料费用 = sum(case 数据表.费用类型 when '材料费用' then 数目 else 0 end),
人工费用 = sum(case 数据表.费用类型 when '人工费用' then 数目 else 0 end),
......
from 部门表.部门 left join 数据表.部门 on 部门表.部门 = 数据表.部门
group by 部门表.部门 ----对部门表中的所有部门分组
完整的字符串为:
exec(N'SELECT a.部门' + @s + N' FROM 部门表 a left join 数据表 on a.部门=数据表.部门 group by a.部门')
刚洗完澡,也来回一贴。
看楼主的要求,列应该是固定的。
SELECT 部门,
材料费用=SUM(ISNUMERIC(ISNULL(NULLIF(费用类型,'材料费用'),0))*数目),
人工费用=SUM(ISNUMERIC(ISNULL(NULLIF(费用类型,'人工费用'),0))*数目),
机械费用=SUM(ISNUMERIC(ISNULL(NULLIF(费用类型,'机械费用'),0))*数目),
其他费用=SUM(ISNUMERIC(ISNULL(NULLIF(费用类型,'其他费用'),0))*数目)
FROM 数据表
GROUP BY 部门
if object_id('test') is not null
drop table test
----创建测试数据
create table test(部门 varchar(50),费用类型 varchar(50),数目 int)
insert test
select '生产','材料费用',150 union all
select '人力','人工费用',260 union all
select '生产','机械费用',330 union all
select '财务','其他费用',400
--select * from @t
DECLARE @str VARCHAR(2000)
SET @str=''
SELECT @str=@str+','+费用类型+'=sum(case when 费用类型='''+费用类型+''' then '+cast(数目 as varchar(10))+' else 0 end)' FROM test
SET @str='SELECT 部门'+@str+' FROM test group by 部门 order by 部门 desc'
--print @str
EXEC(@str)
----清除测试数据
drop table test
SELECT 部门,
材料费用 = SUM(CASE 费用类型 WHEN N'材料费用' THEN 数目 ELSE 0 END),
人工费用 = SUM(CASE 费用类型 WHEN N'人工费用' THEN 数目 ELSE 0 END),
机械费用 = SUM(CASE 费用类型 WHEN N'机械费用' THEN 数目 ELSE 0 END),
其他费用 = SUM(CASE 费用类型 WHEN N'其他费用' THEN 数目 ELSE 0 END)
FROM 数据表
GROUP BY 部门