字段:
职工姓名   部门        交通费    书报费    误餐费
--------------------------------------------------------------------
张三  人事处-处领导        130.00         25.00        200.00
李四    人事处-干部管理科    200.00         12.00        300.00
王二    企业管理处           300.00         25.00        120.00
周五    企业管理处-业务科    200.00         25.00        500.00
----------------------------------------------------------------------
想要产生的结果:部门       人数    交通费           书报费    误餐费
人事处      2      330.00           37.00         500.00
企业管理处  2      500.00           50.00         620.00

解决方案 »

  1.   

    select 部门 = left(部门,charindex('-',部门)-1),
     人数=count(*),
     交通费=sum(交通费),
     书报费=sum(书报费),
     误餐费=sum(误餐费)
     from tb 
      group by left(部门,charindex('-',部门)-1)
      

  2.   

    Select substring(部门,1,charindex('-',部门)-1) as 部门,sum(交通费) as 交通费,sum(书报费) as 书报费,sum(误餐费) as 误餐费 from 表
    Group by substring(部门,1,charindex('-',部门)-1)
      

  3.   

    select left(部门,charindex('-',部门,1)-1) as 部门
        count(*) as 人数
        count(交通费) as 交通费
        count(误餐费) as 误餐费
    from 表名称
    group by left(部门,charindex('-',部门,1)-1)
    order by 部门,人数,交通费,误餐费
      

  4.   

    declare @t table(职工姓名 varchar(20),部门 varchar(20),交通费 dec(10,2),书报费 dec(10,2),误餐费 dec(10,2))
    insert into @t select '张三','人事处-处领导',130.00,25.00,200.00
    union all select '李四','人事处-干部管理科',200.00,12.00,300.00
    union all select '王二','企业管理处',300.00,25.00,120.00
    union all select '周五','企业管理处-业务科',200.00,25.00,500.00-- 这样?
    select 部门=left(部门,charindex('处',部门)),
           人数=count(*),
           交通费=sum(交通费),
           书报费=sum(书报费),
           误餐费=sum(误餐费)
    from @t
     group by left(部门,charindex('处',部门))
     order by left(部门,charindex('处',部门)) desc
      

  5.   

    思路是:
    --------------------------------------------------------------------------------
    1)你是按照'-'的位置取出之前的,作为分组
      故,先找到'-'的位置,然后依照位置,取出前面的字符串
    2)将让取出分组字符串的函数组合,按常规的GROUP BY方式替代即可,记住GROUP BY中的列不能用别名.希望楼主能受到启发!
    在下面贴出一段测试代码,请复制到查询分析器当中,以验证3楼SELECT的正确性.
      

  6.   

    如果都是用'-'表示子部门的话
    可以这样写:
    SELECT   [部门],
             SUM([交通费]),
             SUM([书报费]),
             SUM([误餐费])
    FROM     (
    SELECT   LEFT([部门],CHARINDEX('-',[部门]) - 1) AS [部门],
             [交通费],
             [书报费],
             [误餐费]
    FROM     表
    WHERE    [部门] LIKE '%-%'
    UNION ALL
    SELECT   [部门],
             [交通费],
             [书报费],
             [误餐费]
    FROM     表
    WHERE    [部门] NOT LIKE '%-%'
    ) AS ok
    GROUP BY [部门]
      

  7.   

    select 部门=case when charindex('-',部门)>0 then left(部门,charindex('-',部门)-1) else 部门 end, 人数=count(*), 交通费=sum(交通费),书报费=sum(书报费),误餐费=sum(误餐费)
    from yourtable
    group by case when charindex('-',部门)>0 then left(部门,charindex('-',部门)-1) else 部门 end
      

  8.   

    mislrb(上班看看早报,上上CSDN,下班看看电影) 正解,不加case的话,没有'-'时是取不到部门的。
      

  9.   

    --Try It
    DECLARE @t TABLE(职工姓名 varchar(128), 部门 varchar(128),交通费 dec,书报费 dec,误餐费 dec)
    INSERT @t SELECT '张三','人事处-处领导',130.00 ,25.00,200.00 union all
    SELECT '李四','人事处-干部管理科',200.00 ,12.00,300.00 union all
    SELECT '王二','企业管理处',300.00 ,25.00,120.00 union all
    SELECT '周五','企业管理处-业务科',200.00 ,25.00,500.00 
    -- 分拆处理
    drop table #SELECT TOP  8000 id = IDENTITY(int,1,1) INTO # FROM syscolumns a, syscolumns b
    SELECT  Count(A.职工姓名) as 个数,sum(A.交通费) as 交通费,sum(A.书报费) as 书报费 ,sum(A.误餐费) as 误餐费,部门 = SUBSTRING(A.部门, B.id, CHARINDEX('-', A.部门 + '-', B.id) - B.id)
    FROM @t A, # B
    WHERE SUBSTRING('-' + A.部门, B.id, 1) = '-' 
    group by SUBSTRING(A.部门, B.id, CHARINDEX('-', A.部门 + '-', B.id) - B.id)
      

  10.   

    itblog(^ω^) 变星了!恭喜恭喜!
      

  11.   

    Select left('人事处',(case charindex('-','人事处') when '0' then len('人事处')+1 end )-1) as 部门,sum(交通费) as 交通费,sum(书报费) as 书报费,sum(误餐费) as 误餐费 from 表
    Group by left('人事处',(case charindex('-','人事处') when '0' then len('人事处')+1 end )-1)
      

  12.   

    上面的都忽略了一种情况,会导致部门名称中不含'-'的取得的结果不正确....
    ----------------------------------------------------------------------------------
    我上面的那条也存在这个问题,改了一下:use pubs
    go
    --生成测试数据
    declare @Tb table(职工姓名 varchar(20),部门 varchar(20),交通费 dec(10,2),书报费 dec(10,2),误餐费 dec(10,2))
    insert into @Tb select '张三','人事处-处领导',130.00,25.00,200.00
    union all select '李四','人事处-干部管理科',200.00,12.00,300.00
    union all select '王二','企业管理处',300.00,25.00,120.00
    union all select '周五','企业管理处-业务科',200.00,25.00,500.00
    select * from @Tb--实现功能的SELECT
    select 部门=case when charindex('-',部门,1)>0 then left(部门,charindex('-',部门,1)-1) else 部门 end,
           人数=count(*),
           交通费=sum(交通费),
           书报费=sum(书报费),
           误餐费=sum(误餐费)
    from @tb
    group by case when charindex('-',部门,1)>0 then left(部门,charindex('-',部门,1)-1) else 部门 end
    order by 部门 descGO
      

  13.   

    --确实给漏了,:(,这样:
    select 部门 = left(部门,charindex('-',部门+'-')-1),
     人数=count(*),
     交通费=sum(交通费),
     书报费=sum(书报费),
     误餐费=sum(误餐费)
     from tb 
      group by left(部门,charindex('-',部门+'-')-1)
      

  14.   

    select 部门 = left(部门,charindex('-',部门+'-')-1),
     人数=count(*),
     交通费=sum(交通费),
     书报费=sum(书报费),
     误餐费=sum(误餐费)
     from tb 
      group by left(部门,charindex('-',部门+'-')-1)
      

  15.   

    wangdehao(找找找(现在很幸福)):charindex('-',部门+'-')为什么后门还要加个  +'-' 这个呢?请指教