最近帮同事弄一功能:平均百分比。譬如说做某件事有5步,平均下来也就是:20%,40%,60%,80%,100%。
要是用代码来写的话比较容易:先获取总共有多少步,然后取个平均数,再按照排列顺序查询数据并循环数据,添加相应的百分比,最后设置最后一步为100%。
这样子写起来是不难,但我这个人比较懒,不想用代码写想用一个SQL直接搞定。再加上这个功能第一版时就是用一个SQL来实现的,这个第二版我不想处理的太复杂。
我的处理思路如下:
1、获取平均值,这个比较简单,一个avg就能搞定啦:
declare @avg int; select @avg = (100/count(S_PRO_ID)) from S_ProgressDESC where S_PRO_ID=5; print @avg;
2、将每个步骤排序,这个也不难,可以用SQL Server里面的row_num()方法:
select row_number() over (order by a.S_showorder) as per, a.S_ID as s_id from S_ProgressDESC a where a.S_PRO_ID=5
PS:可以参考:http://blog.csdn.net/dxnn520/article/details/8093628,http://blog.csdn.net/star8816/article/details/3033888
3、将每个步骤按照排序乘以平均数,这个有点难。需要将以上两步联合起来并更新表。试了各种常用的如两个表联合更新,不常用的如将排序后的数据弄成需要更新表的一个字段再更新,都失败了。最后想到用子查询,自己写了几个看似没有问题,却无法执行的SQL。最后在百度上搜到一个有启发的方法,链接如下:http://576017120.iteye.com/blog/1947154(也不知道他这个是怎么执行对的,反正在我的机器上就老报错)。经启发并修改之后的SQL如下:
--1、获取平均值 declare @avg int; select @avg = (100/count(S_PRO_ID)) from S_ProgressDESC where S_PRO_ID=5; print @avg; --2、排序并更新 update S_ProgressDESC set S_PRO_NUM = @avg * aa.per from ( select row_number() over (order by a.S_showorder) as per, a.S_ID as s_id from S_ProgressDESC a where a.S_PRO_ID=5 ) as aa where S_PRO_ID=5 and S_ProgressDESC.S_ID=aa.S_ID
4、将最后一步的百分比设置为100%:
update S_percent='100%' from S_ProgressDESC where S_showorder=( select max(S_showorder) from S_ProgressDESC where S_PRO_ID=5) where S_PRO_ID=5;
PS:测试环境:SQL Server 2005
相关推荐
设置sqlServer使用ROW_NUMBER时不排序 –1.看到NHibernate是这样写的分页,感觉写起来比较容易理解(应该不会有效率问题吧?) –with只是定一个别名? [sql] with query as (select ROW_NUMBER() over(order by ...
一.SQL Server Row_number函数简介 ROW_NUMBER()是一个Window函数,它为结果集的分区中的每一行分配一个连续的整数。 行号以每个分区中第一行的行号开头。 以下是ROW_NUMBER()函数的语法实例: select *,row_...
Microsoft SQL Server近年来不断更新版本,1996年,Microsoft 推出了SQL Server 6.5版本;1998年,SQL Server 7.0版本和用户见面;SQL Server 2000是Microsoft公司于2000年推出,目前最新版本是2019年份推出的SQL ...
本文为大家分享了SQL Server使用row_number分页的实现方法,供大家参考,具体内容如下 1、首先是 select ROW_NUMBER() over(order by id asc) as ‘rowNumber’, * from table1 生成带序号的集合 2、再查询该集合的 ...
SQLServer2005_BC 32/64位 向后兼容兼容补丁
cn_sql_server_2012_enterprise_edition_with_sp1_x64_dvd_1234495.iso sqlserver2012完整版数据库下载
cn_sql_server_2014_enterprise_edition_x64_dvd_3932882.iso,数据库安装镜像
SQL基础_-_MS-SQL_Server___基础类SQL基础_-_MS-SQL_Server___基础类SQL基础_-_MS-SQL_Server___基础类
SQL_Server_使用_SQL_Server_代理作业.
SQLServer2005及以后版本 向前 兼容 DTS等功能64位补丁
通用存储过程分页(使用ROW_NUMBER()和不使用ROW_NUMBER()两种情况)性能分析
partition by关键字是分析性函数的一部分,partition by用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组,本文给大家介绍SQLServer中Partition By及row_number 函数使用详解,需要的朋友参考下
Registar_LECCO_SQL_Expert_For_SQL_Server_v25.rar Registar_LECCO_SQL_Expert_For_SQL_Server_v25.rar
SQLServer2005_SSMSEE_x64 用于64位系统的MSSQL2005数据库的可视化管理工具
SQL ROW_NUMBER()分页比较
Microsoft SQL Server 2008 Internals_中文 Microsoft SQL Server 2008 Internals_中文 Microsoft SQL Server 2008 Internals_中文
Microsoft SQL Server 2005 向后兼容组件SQLServer2005_BC.msi
企业版SQLServer2014_x64