请问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 语句里?

...全文
412 13 打赏 收藏 转发到动态 举报
写回复
用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 工号, 姓名
本课程是PowerBI系列课程之DAX函数专题讲解,包含以下内容 1.  DAX函数基础知识什么是DAX函数数学函数:ABS、DIVIDE、MOD、RAND、ROUND、FIXED等日期和时间函数: CALENDAR、CALENDARAUTO、MONTH、YEAR、DATE、DT等信息函数:USERNAME、USERPRINCIPALNAME、HASONEFILTER、HASONEVALUE、ISFILTERED、ISCROSSFILTERED、ISINSCOPE、ISBLANK、SELECTEDMEASURE、SELECTEDMEASURENAME等逻辑函数:AND、OR、IF、IFERROR、SWITCH、TRUE、FALSE、COALESCE(官方文档含糊不清-结合实例)等关系函数:CROSSFILTER、RELATED、RELATEDTABLE等筛选器函数:FILTER、CALCULATE、ALL、ALLEXCEPT、ALLSELECTED、EARLIER、KEEPFILTERS、REMOVEFILTERS、SELECTEDVALUE、LOOKUPVALUE等父子函数:PATH、PATHCONTAINS、PATHITEM、PATHLENGTH等统计函数:AVERAGE、COUNT、MAX、MIN、SUM等迭代统计函数:AVERAGEX、COUNTX、MAXX、MINX、SUMX、RANKX等表函数: FILTERS 、ADDCOLUMNS、 SELECTCOLUMNS、 CROSSJOIN、 EXCEPT、 GENERATE、 GROUPBY、 SUMMARIZE、 SUMMARIZECOLUMNS、 TOPN、 TREATAS、 UNION、 VALUES、DISTINCT、DATATABLE、NATUALINNERJOIN、NATRUALLEFTOUTERJOIN等文本函数: EXACT、MID、 FIND、 LEN、 REPT、 LOWER、 UPPER、 UNICHAR等时间智能函数:DATEADD、DATESMTD、FIRSTDATE、LASTDATE、SAMEPERIODLASTYEAR等财务函数:2020.7之后发布的,和Excel中财务函数相似,网页和demo pbix简单介绍其他函数:BLANK、ERROR、IFERROR等 DAX函数初体验:Max、Sum、Divide、if、Values等值函数表函数以及表和列的概念DAX函数术语、语法、运算符DAX运算符和引擎中字母大小写问题DAX编程注释和快捷键DAX与Excel函数的共同点和区别(PPT)DAX、xmSQL与SQL表达式的区别(PPT)DAX函数的自学途径 2.  PowerBI中数据建模知识维度建模关系传递和交叉筛选器方向-理解表关系(1v1, 1vM, Mv1,MvM)两个方向上应用安全筛选器关闭关系自动检测新建计算列新建度量值新建计算表:辅助表(五种方式)、日历表数据类型讲解数据格式控制:%、$、千位分隔符、小数位、日期格式Format函数自定义数据格式Convert函数做数据类型转换解决中文数字单位 万 的显示问题Date和DT函数定义固定日期值显示和隐藏列DAX代码分析器阅读DAX表达式方法:从上至下、由内到外(注意Calculate的计算顺序)调试DAX表达式方法:分布输出或VAR输出3.  DAX函数原理 Vertipaq列式数据库原理理解度量值和计算列理解行上下文和筛选上下文:Calculate示意图行上下文中使用VAR替代EARLIERVAR变量在定义时的上下文中计算VAR变量是采用惰性计算(使用时计算)理解扩展表和RELATED函数理解数据沿袭Lineage 4.  开始感知DAX函数的强大DAX函数实现特殊符号的使用DAX函数实现切片器默认当前月或天DAX函数使切片器默认代表无任何选择DAX函数使切片器仅显示有数据的选项DAX函数使切片器反向筛选和计算DAX函数使切片器之间取并集DAX函数使关系中多端的切片器筛选一端的切片器 DAX函数实现年月共同决定数据排序DAX函数实现动态图表标题DAX函数实现动态图表配色和图标DAX函数实现动态纵坐标DAX函数实现动态横坐标5.  理解重点DAX函数重中之重FILTER 和 CALCULATE和CALCULATETABLE详解调节器REMOVEFILTERS和ALL、ALLEXCEPT函数调节器ALL、ALLSELECTED和ISINSCOPE占比分析调节器AllSELECTED和KEEPFILTERS的比较调节器USERELATIONSHIP激活关系调节器TREATAS动态建立关系调节器CROSSFILTER改变筛选器方向重点之ISFILTERED和ISCROSSFILTERED重点之HASONEVALUE和ISINSCOPE的区别重点之表函数SELECTEDCOLUMNS和ADDCOLUMNS重点之表函数NATUALINNERJOIN和NATRUALLEFTOUTERJOIN重点之表函数FILTERS和VALUES比较重点之VALUES和DISTINCT的区别重点之分组函数SUMMARIZECOLUMNS详解重点之函数LOOKUPVALUE vs RELATED vs VLOOKUP 重点之集合函数UNION、INTERSECT、EXCEPT重点之集合函数CROSSJOIN和GENERATE 笛卡尔积重点之值合并、列合并、表合并CONCATENATEX重点之BLANK行产生的原因和BLANK相关函数重点之COALESCE函数处理空重点之FIRSTNOBLANK和FIRSTNOBLANKVALUE函数重点之使用VAR变量表中的列重点之Error和IfError函数6.  实际案例-日期时间和时间智能相关关键点-日期表和事实表关联问题时间智能-同比环比分析时间智能-累计聚合、滚动聚合、移动平均时间智能-期初期末库存分析日期分析-计算任意所选月份的环比日期分析-周的同比环比和周聚合日期分析-指定月份的同比环比和季度环比日期分析-计算季末或季末月份的数据日期分析-趋势图中根据最近月份取TopN日期分析-动态指定某个日期区间分析日期分析-动态任意区间段做数据对比日期分析-实现两个日期列的范围筛选日期分析-按工作日计算日期差日期分析-计算最近两次购买日期差日期分析-根据历史数据做销售预测日期时间函数和时间智能函数使用总结7.  实际案例-DAX函数进阶进阶-解决列排序对计算的影响进阶-实现切片器筛选之间的OR逻辑进阶-矩阵Matrix中高亮显示最大值最小值进阶-DAX列转行 vs 矩阵列转行和逆透视进阶-非日期类型的累计聚合进阶-排名逻辑的4种实现-RANKX详解进阶-分组内排名的实现和理解迭代函数进阶-TopN/BottomN和Others的实现进阶-TopN中实现动态指标进阶-TopN中实现N的动态进阶-分组内动态TopN和Others 进阶-商品折上折-迭代函数SUMX详解 进阶-分析客户购买行为进阶-找出无购买行为的客户进阶-客户购买商品关联度分析 进阶-新客户分析进阶-流失客户分析进阶-回流客户分析进阶-客户购买频次和区间分析进阶-RFM客户价值分析进阶-帕累托分析进阶-盈亏平衡分析报表性能优化思路(PPT)  

34,593

社区成员

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

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