|
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
(不管意义有多大,本人只是想提供一个解决问题的思路,与大家共同探讨这类问题的解决办法,比如:成绩排名一定会涉及类似的情形吧,当然,用数据透视表来解决对于我来说还未尝试),好了,言规正传。
如果收益没有重复值的话,行业内排名前5位求平均值(前5个大值),通过数据透视表的筛选功能即可求得,是很容易求的。但是,如果有重复值,怎么求呢?要不是所有重复值全部计算平均值,但如果只需要前5位的值计算平均值的话,用数据透视表来做并不是那么简单的。
下图是收益有重复值的行业内排名前5位求平均值的数据透视表结果:
现以 http://club.excelhome.net/viewth ... p;extra=&page=3 中25楼的附件数据为例(其它楼层的数据好像做了修改,没有重复值)来说明用SQL如何求
收益有重复值的行业内排名前5位求平均值。
收益有重复值的行业内排名前5位求平均值SQL见下图:
以上语句中关键是利用行业内收益"排名1"来进行主要排位,- (select 1+count(*) from
- (select distinct 行业,收益 from [Sheet1$]) a where a.行业=b.行业 and a.收益>b.收益) as 排名1,
复制代码 再利用名称的大小来进行次排位获得"排名2",- (select 1+count(*) from
- (select distinct 行业,名称 from [sheet1$]) c where c.行业=b.行业 and c.名称>b.名称) as 排名2,
复制代码 利用val(排名1&排名2) 以此生成字段"排序",做为最后排位的依据。
最后以自表查询来获得字段:行业,名称,收益,排位。- select *,
- (select 1+count(*) from
- (select distinct 行业,名称 from [sheet1$]) c where c.行业=b.行业 and c.名称>b.名称) as 排名2,
- (select 1+count(*) from
- (select distinct 行业,收益 from [Sheet1$]) a where a.行业=b.行业 and a.收益>b.收益) as 排名1,
- val(排名1&排名2) as 排序 from
- [sheet1$] b
复制代码 通过以上SQL的组合生成行业内收益排名前5位的数据透视表。 |
|