declare @s varchar(8000)
set @s=''
select @s=@s+',['+部门名称+']=sum(case b.部门编码 when '''+部门编码+''' then b.预算 else 0 end)'
from 部门表
exec('
select a.科目名称'+@s+'
from 科目表 a,预算表 b
where a.科目编码=b.科目编码
group by a.科目名称')

解决方案 »

  1.   

    --楼主是要所有的科目,改用left joindeclare @s varchar(8000)
    set @s=''
    select @s=@s+',['+部门名称+']=sum(case b.部门编码 when '''+部门编码+''' then b.预算 else 0 end)'
    from 部门表
    exec('
    select a.科目名称'+@s+'
    from 科目表 a left join 预算表 b on a.科目编码=b.科目编码
    group by a.科目编码,a.科目名称
    order by a.科目编码')
      

  2.   

    --测试--测试数据
    create table 预算表(科目编码 varchar(10),部门编码 varchar(10),预算 decimal(10,2))
    insert 预算表 select '001','01',1500.00
    union  all    select '002','02',3500.00
    union  all    select '001','05',12.00create table 科目表(科目编码 varchar(10),科目名称 varchar(10))
    insert 科目表 select '001','广告费'
    union  all    select '002','水电费'
    union  all    select '003','会议费'create table 部门表(部门编码 varchar(10),部门名称 varchar(10))
    insert 部门表 select '01','计算机中心'
    union  all    select '02','总经办'
    union  all    select '05','业务部'
    go--查询
    declare @s varchar(8000)
    set @s=''
    select @s=@s+',['+部门名称+']=sum(case b.部门编码 when '''+部门编码+''' then b.预算 else 0 end)'
    from 部门表
    exec('
    select a.科目名称'+@s+'
    from 科目表 a left join 预算表 b on a.科目编码=b.科目编码
    group by a.科目编码,a.科目名称
    order by a.科目编码')
    go--删除测试
    drop table 部门表,科目表,预算表/*--测试结果科目名称       计算机中心  总经办       业务部    
    ---------- -------------- ---------- -----------
    广告费        1500.00     .00         12.00
    水电费        .00         3500.00     .00
    会议费        .00         .00         .00
    --*/