查看: 12543|回复: 12

【讨论】oracle 分组后如何求平均值?

[复制链接]
论坛徽章:
1
优秀写手
日期:2014-10-30 06:00:12
跳转到指定楼层
1#
发表于 2014-10-28 22:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我需要统计一个作业计划下每个人的操作量,每个人都有自己的部门。
现在的需求是,我先要分开每个部门,然后把所有的工作量平均分给各个部门的人。
比如:

现在我查询出来的SQL结果如下
A            1               6000
B            1               6000
C            2               6000      
D            2               6000
E            2               6000

我想根据上表的结果得到下面这个结果

人员      部门         作业量
A            1                3000
B            1                3000
C            2                2000            
D            2                2000
E            2                2000
总作业量是6000,部门1的2个人平分6000,部门2的3个人平分6000。

论坛徽章:
737
季节之章:春
日期:2015-07-31 17:16:29ITPUB季度 技术新星
日期:2014-07-17 14:37:00季节之章:秋
日期:2015-07-31 17:16:14季节之章:夏
日期:2015-07-31 17:16:29股神
日期:2014-10-15 09:23:31衰神
日期:2014-10-20 22:47:12季节之章:冬
日期:2015-07-31 17:16:14红钻
日期:2014-12-16 17:51:41洛杉矶湖人
日期:2016-09-23 08:18:15布鲁克林篮网
日期:2016-09-23 08:17:18
2#
发表于 2014-10-28 22:07 | 只看该作者
with t as (
SELECT 'A' name,'1'dept,'3000' work from dual union all            
SELECT 'B' name,'1'dept,'3000' work from dual union all            
SELECT 'C' name,'2'dept,'2000' work from dual union all            
SELECT 'D' name,'2'dept,'2000' work from dual union all            
SELECT 'E' name,'2'dept,'2000' work from dual union all
SELECT 'C' name,'4'dept,'1500' work from dual union all            
SELECT 'D' name,'4'dept,'1000' work from dual union all            
SELECT 'E' name,'4'dept,'3500' work from dual
)  
SELECT T.*, SUM(WORK) OVER(PARTITION BY DEPT ORDER BY 1) NEW_WORK FROM T;

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-10-30 06:00:12
3#
 楼主| 发表于 2014-10-28 22:22 | 只看该作者
oracle_cj 发表于 2014-10-28 22:07
with t as (
SELECT 'A' name,'1'dept,'3000' work from dual union all            
SELECT 'B' name,'1 ...

第一次查出来的是全6000,,,
那个区分开的才是我想要的效果= =。我觉得你看反了。。

使用道具 举报

回复
论坛徽章:
737
季节之章:春
日期:2015-07-31 17:16:29ITPUB季度 技术新星
日期:2014-07-17 14:37:00季节之章:秋
日期:2015-07-31 17:16:14季节之章:夏
日期:2015-07-31 17:16:29股神
日期:2014-10-15 09:23:31衰神
日期:2014-10-20 22:47:12季节之章:冬
日期:2015-07-31 17:16:14红钻
日期:2014-12-16 17:51:41洛杉矶湖人
日期:2016-09-23 08:18:15布鲁克林篮网
日期:2016-09-23 08:17:18
4#
发表于 2014-10-28 22:29 | 只看该作者
是lz你搞反了,自己将结果编辑反了,说我看反了?那你为什么要重新编辑顶楼呢,此题不会做

使用道具 举报

回复
论坛徽章:
737
季节之章:春
日期:2015-07-31 17:16:29ITPUB季度 技术新星
日期:2014-07-17 14:37:00季节之章:秋
日期:2015-07-31 17:16:14季节之章:夏
日期:2015-07-31 17:16:29股神
日期:2014-10-15 09:23:31衰神
日期:2014-10-20 22:47:12季节之章:冬
日期:2015-07-31 17:16:14红钻
日期:2014-12-16 17:51:41洛杉矶湖人
日期:2016-09-23 08:18:15布鲁克林篮网
日期:2016-09-23 08:17:18
5#
发表于 2014-10-28 22:33 | 只看该作者
数据都造出来了,接着搞吧。。。
with t as (
SELECT 'A' name,'1'dept,'6000' work from dual union all            
SELECT 'B' name,'1'dept,'6000' work from dual union all            
SELECT 'C' name,'2'dept,'6000' work from dual union all            
SELECT 'D' name,'2'dept,'6000' work from dual union all            
SELECT 'E' name,'2'dept,'6000' work from dual union all
SELECT 'C' name,'4'dept,'6000' work from dual union all            
SELECT 'D' name,'4'dept,'6000' work from dual union all            
SELECT 'E' name,'4'dept,'6000' work from dual
)  
SELECT t.*,WORK/COUNT(*)OVER(PARTITION BY dept ORDER BY 1) FROM t;

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-10-30 06:00:12
6#
 楼主| 发表于 2014-10-28 22:34 | 只看该作者
oracle_cj 发表于 2014-10-28 22:33
数据都造出来了,接着搞吧。。。
with t as (
SELECT 'A' name,'1'dept,'6000' work from dual union all ...

我是怕继续误会才编辑下的啊。。。完全没冒犯的意思啊~别发火啊大哥~

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-10-30 06:00:12
7#
 楼主| 发表于 2014-10-28 22:37 | 只看该作者
oracle_cj 发表于 2014-10-28 22:33
数据都造出来了,接着搞吧。。。
with t as (
SELECT 'A' name,'1'dept,'6000' work from dual union all ...

测试可行。感谢帮忙!!!

使用道具 举报

回复
论坛徽章:
737
季节之章:春
日期:2015-07-31 17:16:29ITPUB季度 技术新星
日期:2014-07-17 14:37:00季节之章:秋
日期:2015-07-31 17:16:14季节之章:夏
日期:2015-07-31 17:16:29股神
日期:2014-10-15 09:23:31衰神
日期:2014-10-20 22:47:12季节之章:冬
日期:2015-07-31 17:16:14红钻
日期:2014-12-16 17:51:41洛杉矶湖人
日期:2016-09-23 08:18:15布鲁克林篮网
日期:2016-09-23 08:17:18
8#
发表于 2014-10-28 22:41 | 只看该作者
lz忽悠我倒着做一遍,正着做一遍啊

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
9#
发表于 2014-10-28 23:03 来自手机 | 只看该作者
oracle_cj 发表于 2014-10-28 22:41
lz忽悠我倒着做一遍,正着做一遍啊

看他id就知
批oracle

使用道具 举报

回复
求职 : 数据库开发
论坛徽章:
41
2017金鸡报晓
日期:2017-02-08 14:09:13秀才
日期:2016-01-13 12:14:26秀才
日期:2016-01-12 11:23:27金牛座
日期:2016-01-03 20:58:56秀才
日期:2015-12-21 09:53:46秀才
日期:2015-12-21 09:48:11秀才
日期:2015-12-18 09:28:57秀才
日期:2015-12-14 15:02:13秀才
日期:2015-11-23 09:48:22秀才
日期:2016-01-21 13:37:04
10#
发表于 2014-10-28 23:29 | 只看该作者
oracle_cj 发表于 2014-10-28 22:33
数据都造出来了,接着搞吧。。。
with t as (
SELECT 'A' name,'1'dept,'6000' work from dual union all ...

这些开窗函数用的很溜么

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表