ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 5031|回复: 10

[原创] SQL练习-去除指定前N项之和后求平均值。【开贴】

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-4-18 11:16 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 wuxiang_123 于 2012-4-21 09:12 编辑

要求:
要求说明.png

使用MQ完成的效果:
效果.gif

  1. 思路:
  2. 第一部分:找出排名值比指定值大中的最小值和其对应的总分,即获取临界值。用【指定值-临界值排名+临界值对应总分在原始数据源出现的次数】即为改临界值的总分多加了的次数,将此*临界值总分则为多加了的总分之和。
  3. 第二部分:找出排名值比指定值小于或等于的总分之和
  4. 第三部分:找出数据源的总分之和,将总数-指定值获得平均值的分母。
  5. 第四部分:第一部分计算出多加的总分之和和第二部分计算的总分之和相加,即为应减去的指定前N值总分之和,然后用【(第三部的总分之和-指定前N值总分之和)/(总数-指定前N值)】从而得出需求的平均值。

  6. OLE DB:
  7. SELECT 班级,SUM(总分)/(SUM(数)-F1) AS 平均值 FROM
  8. (SELECT F1 AS 班级,F2 AS 总分,1 AS 数 FROM [数据源$A2:B]
  9. UNION ALL
  10. SELECT A1.班级,-A1.临界总分*(A1.F1-A1.临界排名+SUM(1)),0 FROM
  11. (SELECT 班级,F1,MAX(总分) AS 临界总分,MIN(排名) AS 临界排名 FROM
  12. (SELECT A.F1 AS 班级,A.F2 AS 总分,C.F1,SUM(1) AS 排名 FROM (SELECT DISTINCT * FROM [数据源$A2:B])A,[数据源$A2:B]B,[结果$B1:B1]C
  13. WHERE A.F1=B.F1 AND A.F2<=B.F2
  14. GROUP BY A.F1,A.F2,C.F1
  15. HAVING SUM(1)>C.F1)
  16. GROUP BY 班级,F1)A1,
  17. [数据源$A2:B]A2
  18. WHERE A1.班级=A2.F1 AND A1.临界总分=A2.F2
  19. GROUP BY A1.班级,A1.临界总分,A1.临界排名,A1.F1
  20. UNION ALL
  21. SELECT A2.班级,-SUM(A1.F2),0 FROM [数据源$A2:B]A1,
  22. (SELECT A.F1 AS 班级,A.F2 AS 总分 FROM (SELECT DISTINCT * FROM [数据源$A2:B])A,[数据源$A2:B]B,[结果$B1:B1]C
  23. WHERE A.F1=B.F1 AND A.F2<=B.F2
  24. GROUP BY A.F1,A.F2,C.F1
  25. HAVING SUM(1)<=C.F1)A2
  26. WHERE A1.F1=A2.班级 AND A1.F2=A2.总分
  27. GROUP BY A2.班级)Q1,[结果$B1:B1]
  28. GROUP BY 班级,F1

  29. MQ:
  30. SELECT 班级,SUM(总分)/(SUM(数)-?) AS 平均值 FROM
  31. (SELECT 班级,总分,1 AS 数 FROM [数据源$]
  32. UNION ALL
  33. SELECT A1.班级,-A1.临界总分*(?-A1.临界排名+SUM(1)),0 FROM
  34. (SELECT 班级,MAX(总分) AS 临界总分,MIN(排名) AS 临界排名 FROM
  35. (SELECT A.班级,A.总分,SUM(1) AS 排名 FROM (SELECT DISTINCT * FROM [数据源$])A LEFT JOIN [数据源$]B
  36. ON A.班级=B.班级 AND A.总分<=B.总分
  37. GROUP BY A.班级,A.总分
  38. HAVING SUM(1)>?)
  39. GROUP BY 班级)A1,
  40. [数据源$]A2
  41. WHERE A1.班级=A2.班级 AND A1.临界总分=A2.总分
  42. GROUP BY A1.班级,A1.临界总分,A1.临界排名
  43. UNION ALL
  44. SELECT A1.班级,-SUM(A1.总分),0 FROM [数据源$]A1,
  45. (SELECT A.班级,A.总分 FROM (SELECT DISTINCT * FROM [数据源$])A LEFT JOIN [数据源$]B
  46. ON A.班级=B.班级 AND A.总分<=B.总分
  47. GROUP BY A.班级,A.总分
  48. HAVING SUM(1)<=?)A2
  49. WHERE A1.班级=A2.班级 AND A1.总分=A2.总分
  50. GROUP BY A1.班级)
  51. GROUP BY 班级
复制代码

去掉前N项最大值后求平均值.rar (55.85 KB, 下载次数: 47)
该贴已经同步到 wuxiang_123的微博

数据.rar

7.97 KB, 下载次数: 37

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-4-18 23:38 | 显示全部楼层
Sub s()
Set conn = New ADODB.Connection
Dim rst As New ADODB.Recordset
conn.ConnectionString = "provider=microsoft.jet.oledb.4.0;extended properties='excel 8.0';data source='" & ThisWorkbook.FullName & "'"
conn.Open conn.ConnectionString
rst.Source = "select sum(总分)/count(总分) from (select top count(班级)-3 总分 from [数据源$] where 班级='A' order by 总分)"
rst.Open , conn.ConnectionString
[l2].CopyFromRecordset conn.Execute(rst.Source)
End Sub
不过有个错误,好像Top的排名包含同名次的,会把所有排名为5 的加进来

TA的精华主题

TA的得分主题

发表于 2012-4-18 22:25 | 显示全部楼层
本帖最后由 卢子 于 2012-4-18 22:27 编辑

SQL的排名不怎么喜欢,总觉得不太方便,先上个辅助列的做法,回头得闲搞个完整的
QQ截图20120418222325.gif
利用参数查询,里面的语句稍作变动,复制下来
SELECT `数据源$`.班级, avg(`数据源$`.总分) as 平均分
FROM `C:\Users\今朝\Desktop\数据.xls`.`数据源$` `数据源$`
WHERE (`数据源$`.排名>?) group by `数据源$`.班级

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-4-19 11:07 | 显示全部楼层
卢子 发表于 2012-4-18 22:25
SQL的排名不怎么喜欢,总觉得不太方便,先上个辅助列的做法,回头得闲搞个完整的

利用参数查询,里面的语 ...

对记录进行排序,再添加辅助列的确简单,但符合要求.
不对记录排序,然后直接以序列号作辅助列也不复杂,但这些都不符合要求.
不过,通常录入的数据,每行记录都是不重复的,本帖的数据是为了增加难度,从实际来说,不可取,仅作为技术交流.

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-4-19 11:12 | 显示全部楼层
fankairong 发表于 2012-4-18 23:38
Sub s()
Set conn = New ADODB.Connection
Dim rst As New ADODB.Recordset

呵呵,我第一次也是想利用TOP,利用TOP不指定ORDER BY子句时,返回结果集靠N项记录,然后对这些记录进行求和,不过测试没有成功,尽管语句理论上是可行的(又或者是我弄错了).
但是,使用这种方法,即使获得通过,其速度也会很慢,所以,我的答案用其他方法来代替实现了.

TA的精华主题

TA的得分主题

发表于 2012-4-19 13:53 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
这个299真是不好整.....

TA的精华主题

TA的得分主题

发表于 2012-4-20 08:55 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
top或者是dcount都无法实现,唯有等答案了

TA的精华主题

TA的得分主题

发表于 2012-4-20 16:29 | 显示全部楼层
select sum(总分)/count(*) from 数据源 where 总分 not in (select top 3 总分 from 数据源 order by 总分 desc)

TA的精华主题

TA的得分主题

发表于 2012-4-20 16:46 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-4-20 19:58 | 显示全部楼层
开帖?答案呢??

点评

一楼.  发表于 2012-4-21 09:18
一楼.  发表于 2012-4-21 09:16
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-28 05:29 , Processed in 0.047637 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表