字段:
职工姓名 部门 交通费 书报费 误餐费
--------------------------------------------------------------------
张三 人事处-处领导 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
职工姓名 部门 交通费 书报费 误餐费
--------------------------------------------------------------------
张三 人事处-处领导 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
人数=count(*),
交通费=sum(交通费),
书报费=sum(书报费),
误餐费=sum(误餐费)
from tb
group by left(部门,charindex('-',部门)-1)
Group by substring(部门,1,charindex('-',部门)-1)
count(*) as 人数
count(交通费) as 交通费
count(误餐费) as 误餐费
from 表名称
group by left(部门,charindex('-',部门,1)-1)
order by 部门,人数,交通费,误餐费
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
--------------------------------------------------------------------------------
1)你是按照'-'的位置取出之前的,作为分组
故,先找到'-'的位置,然后依照位置,取出前面的字符串
2)将让取出分组字符串的函数组合,按常规的GROUP BY方式替代即可,记住GROUP BY中的列不能用别名.希望楼主能受到启发!
在下面贴出一段测试代码,请复制到查询分析器当中,以验证3楼SELECT的正确性.
可以这样写:
SELECT [部门],
SUM([交通费]),
SUM([书报费]),
SUM([误餐费])
FROM (
SELECT LEFT([部门],CHARINDEX('-',[部门]) - 1) AS [部门],
[交通费],
[书报费],
[误餐费]
FROM 表
WHERE [部门] LIKE '%-%'
UNION ALL
SELECT [部门],
[交通费],
[书报费],
[误餐费]
FROM 表
WHERE [部门] NOT LIKE '%-%'
) AS ok
GROUP BY [部门]
from yourtable
group by case when charindex('-',部门)>0 then left(部门,charindex('-',部门)-1) else 部门 end
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)
Group by left('人事处',(case charindex('-','人事处') when '0' then len('人事处')+1 end )-1)
----------------------------------------------------------------------------------
我上面的那条也存在这个问题,改了一下: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
select 部门 = left(部门,charindex('-',部门+'-')-1),
人数=count(*),
交通费=sum(交通费),
书报费=sum(书报费),
误餐费=sum(误餐费)
from tb
group by left(部门,charindex('-',部门+'-')-1)
人数=count(*),
交通费=sum(交通费),
书报费=sum(书报费),
误餐费=sum(误餐费)
from tb
group by left(部门,charindex('-',部门+'-')-1)