请问group by 的聚合函数问题

parv2 2017-11-06 04:48:02
使用 sqlserver2008 版

表内容如下

计件表
工号 姓名 计件奖金
001 张三 40
001 张三 20
002 李四 30
002 李四 20
003 王五 20

需要汇总每个人的计件奖金 保存到一个 汇总表里

现在使用的语句是
select 工号,sum(计件奖金) form 工资表 group by 工号

这样可以 汇总出 各人的 总奖金,
但是 我同时 还想 在 结果中得到 人员的姓名 请问 有什么 函数可以吗? 据说 2012版 有 first_value 函数,但是 2008 没有啊


另外 我现在是 查询到 汇总的 数据后 逐条 再 insert into

有没有更 高效 的 办法 直接把 汇总 和 insert into 写在一条 sql 语句里?

...全文
420 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
道素 2017-11-08
  • 打赏
  • 举报
回复
1.一个工号只会有一个姓名,一个工号不会存在多行(除非多个名字用一个工号) 2.即使多个工号的名字相同,但因为工号在Group By中也会单独计算,所以如果没有多个名字共用一个工号的情况,group by加个姓名对结果没有影响 3.如果你有一个单独的工号对应姓名表(应该有一个)你也可以用工号汇总完的结果在JOIN这个表取得这个工号其他附加信息(不限于姓名)
shadowpj 2017-11-07
  • 打赏
  • 举报
回复
不存在的啊兄弟,就直接用 insert 汇总表(工号,姓名,奖金合计) select 工号,姓名,isnull(sum(计件奖金),0) from 工资表 group by 工号,姓名
xiaoxiangqing 2017-11-07
  • 打赏
  • 举报
回复
select 工号,max(姓名) 姓名,sum(计件奖金) form 工资表 group by 工号
顺势而为1 2017-11-07
  • 打赏
  • 举报
回复
引用 9 楼 qq_37170555 的回复:
[quote=引用 4 楼 parv2 的回复:] [quote=引用 1 楼 appetizing_fish1 的回复:] 工号与姓名是一起的, 你可以直接 select 工号,姓名, sum(计件奖金) form 工资表 group by 工号, 姓名
我觉得这样 会降低效率, 因为要 group 工号一次 还要 再group 姓名一次 并且 我这里 有的时候 姓名 有可能出现 同音字的[/quote] 我就想问问什么叫做你觉得,你怎么不觉得你中午吃了饭,晚上在吃饭就是浪费粮食呢。我也是醉了[/quote]
听雨停了 2017-11-07
  • 打赏
  • 举报
回复
引用 4 楼 parv2 的回复:
[quote=引用 1 楼 appetizing_fish1 的回复:] 工号与姓名是一起的, 你可以直接 select 工号,姓名, sum(计件奖金) form 工资表 group by 工号, 姓名
我觉得这样 会降低效率, 因为要 group 工号一次 还要 再group 姓名一次 并且 我这里 有的时候 姓名 有可能出现 同音字的[/quote] 我就想问问什么叫做你觉得,你怎么不觉得你中午吃了饭,晚上在吃饭就是浪费粮食呢。我也是醉了
顺势而为1 2017-11-07
  • 打赏
  • 举报
回复
引用 6 楼 parv2 的回复:
请问 有没有 比 SELECT gh ,SUM(jijian),SUM(gandian),SUM(chengwubu) ,(select top 1 xm from cwyjj_2017.dbo.cwy_jilu where gh=t1.gh) FROM cwyjj_2017.dbo.cwy_jilu as t1 GROUP BY gh 高效的方法?
你这个用的是子查询, 效率肯定不高
parv2 2017-11-07
  • 打赏
  • 举报
回复
请问 有没有 比 SELECT gh ,SUM(jijian),SUM(gandian),SUM(chengwubu) ,(select top 1 xm from cwyjj_2017.dbo.cwy_jilu where gh=t1.gh) FROM cwyjj_2017.dbo.cwy_jilu as t1 GROUP BY gh 高效的方法?
顺势而为1 2017-11-07
  • 打赏
  • 举报
回复
引用 4 楼 parv2 的回复:
[quote=引用 1 楼 appetizing_fish1 的回复:] 工号与姓名是一起的, 你可以直接 select 工号,姓名, sum(计件奖金) form 工资表 group by 工号, 姓名
我觉得这样 会降低效率, 因为要 group 工号一次 还要 再group 姓名一次 并且 我这里 有的时候 姓名 有可能出现 同音字的[/quote] 那这样可以吗


if not object_id(N'Tempdb..#tab') is null
    drop table #tab
Go
Create table #tab([工号] nvarchar(23),[姓名] nvarchar(22),[计件奖金] int)
Insert #tab
select N'001',N'张三',40 union all
select N'001',N'张三',20 union all
select N'002',N'李四',30 union all
select N'002',N'李四',20 union all
select N'003',N'王五',20


Select a.工号,姓名,a.计件奖金
From (
          Select 工号,sum(计件奖金) as 计件奖金 From #Tab Group By 工号
	  ) a
	Join (Select 工号,姓名,Row_No=Row_number() over (partition by 工号 Order By 工号) From #tab) b on a.工号=b.工号
Where Row_No=1

工号                      姓名                     计件奖金
----------------------- ---------------------- -----------
001                     张三                     60
002                     李四                     50
003                     王五                     20

吉普赛的歌 版主 2017-11-07
  • 打赏
  • 举报
回复
引用 4 楼 parv2 的回复:
[quote=引用 1 楼 appetizing_fish1 的回复:] 工号与姓名是一起的, 你可以直接 select 工号,姓名, sum(计件奖金) form 工资表 group by 工号, 姓名
我觉得这样 会降低效率, 因为要 group 工号一次 还要 再group 姓名一次 并且 我这里 有的时候 姓名 有可能出现 同音字的[/quote] 工号已经是唯一确定一个人的了, 姓名不过是保证姓名这个字段能出现, 逻辑上不会有问题。 至于效率, 你实际执行看看, 到底慢不慢?慢了再说, 看菜下饭
parv2 2017-11-07
  • 打赏
  • 举报
回复
引用 1 楼 appetizing_fish1 的回复:
工号与姓名是一起的, 你可以直接 select 工号,姓名, sum(计件奖金) form 工资表 group by 工号, 姓名
我觉得这样 会降低效率, 因为要 group 工号一次 还要 再group 姓名一次 并且 我这里 有的时候 姓名 有可能出现 同音字的
二月十六 版主 2017-11-06
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([工号] nvarchar(23),[姓名] nvarchar(22),[计件奖金] int)
if not object_id(N'Tempdb..#T2') is null
drop table #T2
Go
Create table #T2([工号] nvarchar(23),[姓名] nvarchar(22),[汇总奖金] int)
Insert #T
select N'001',N'张三',40 union all
select N'001',N'张三',20 union all
select N'002',N'李四',30 union all
select N'002',N'李四',20 union all
select N'003',N'王五',20
Go
--测试数据结束
INSERT INTO #T2
( 工号 ,
姓名 ,
汇总奖金
)
SELECT 工号 ,
姓名 ,
SUM(计件奖金)
FROM #T
GROUP BY 工号 ,
姓名;

SELECT * FROM #T2


听雨停了 2017-11-06
  • 打赏
  • 举报
回复

use Tempdb
go
--> --> 听雨停了-->测试数据
 
if not object_id(N'Tempdb..#tab') is null
	drop table #tab
Go
Create table #tab([工号] nvarchar(23),[姓名] nvarchar(22),[计件奖金] int)
Insert #tab
select N'001',N'张三',40 union all
select N'001',N'张三',20 union all
select N'002',N'李四',30 union all
select N'002',N'李四',20 union all
select N'003',N'王五',20
--测试数据结束

--INSERT INTO 表名	--(前提是这个表已经创建了,如没创建,就直接在下面into 表名字)
SELECT 工号,
       [姓名],
       SUM(计件奖金)
--INTO 表名 --(自动创建一个表把查询结果插入)
FROM   #tab
GROUP BY 工号,
       [姓名]
       
工号                      姓名                     
----------------------- ---------------------- -----------
002                     李四                     50
003                     王五                     20
001                     张三                     60
顺势而为1 2017-11-06
  • 打赏
  • 举报
回复
工号与姓名是一起的, 你可以直接 select 工号,姓名, sum(计件奖金) form 工资表 group by 工号, 姓名

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧