表a, b, c//表结构
a: 部门, 费用名称, 费用金额//表记录
   财务部,  工资,    100000
   财务部, 交通费, 5000
   采购部, 交通费, 1000
   采购部, 工资,   20000求: 将费用按部门统计出来费用名称  财务部, 采购部, ..., 合计
工资      100000   20000    .... xxxxxxx
交通费    5000     1000     .... xxxxxxx
..............
合计      xxxxx    xxxxx    .... xxxxxxx有好的方法吗?
   

解决方案 »

  1.   


    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)
      

  2.   

    这是一个很常见的交叉表查询问题,用楼上的SQL应该可以解决。
      

  3.   

    libin_ftsafe(子陌红尘:当libin告别ftsafe) ( ) 信誉:105    Blog  2007-02-02 09:51:51  得分: 0  
     
     
       这是一个很常见的交叉表查询问题,用楼上的SQL应该可以解决。
      
     
    ------------------
    哈哈~
      

  4.   

    create table A (部門 varchar(20),[費用名稱] varchar(20),金額 int)insert into A
    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
      

  5.   

    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
      

  6.   

    TO libin_ftsafe(子陌红尘:当libin告别ftsafe):  首先: 向五星高手致以崇高敬意!   呵! 没想到发贴还不到一分钟,就有人回了, 不过,大哥,我还是只SQL菜鸟, 菜到看不懂你给的答案, 你那是个存贮过程吗? 我用C++ 和 ADO, 以前很少写数据库相关的程序, 麻烦给我解释一下吧!
      

  7.   

    create proc dbo.usp_test
    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就可以了
      

  8.   

    小弟不才,出来帮忙解释一下,说得不对,请扔砖头。~:)
    一楼写的那不是存储过程,只是一段普通的sql代码,其意义在于先生成可以完成查询的语句的字符串,然后再执行这个字符串。这个过程很多人称为拼动态sql语句利用这种方法可以动态生成列名以及进行对行列的转换操作。
      

  9.   


    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