| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1275 人关注过本帖
标题:一个有挑战性的查询问题
只看楼主 加入收藏
gdzhan
Rank: 2
等 级:论坛游民
帖 子:90
专家分:14
注 册:2007-4-15
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:10 
一个有挑战性的查询问题
是这样的,一个考勤系统,每月出勤天数为22天,
如果有些员工出勤天数大于22天,比如25天,28天
我需要在这一个月当中查询出大于22天的并且出勤小时最少的那些天,请问SQL怎么写,

如果固定是多少天就好做,直接select top 3 * from table就出来了,
问题是这个top 3,这个3不是固定的,是个动态的数字,还有就是,我的环境里不能用存储过程的,只能用单条SQL
搜索更多相关主题的帖子: 挑战性 查询 
2010-08-03 14:48
autobot
Rank: 4
等 级:业余侠客
帖 子:71
专家分:202
注 册:2007-9-6
收藏
得分:0 
没看明白你的意思,是不是这样的:如果库里有一个人叫A 他出勤为23天,这多出来的一天,你要把他的这23天里出勤最少小时的那一天给找出来是这意思吗?
2010-08-03 16:28
dearwolf4128
Rank: 5Rank: 5
来 自:陕西西安
等 级:职业侠客
威 望:6
帖 子:79
专家分:365
注 册:2010-7-2
收藏
得分:7 
select 字段1,字段2...... from 表 where 表.员工月出勤天数>22 and 出勤时间 in (国家法定节假日) group by 员工  order by 每天的出勤时间

每月的出勤时间如果大于22天,一般情况都为国家法定节假日,你要的出勤时间是大于22天后的最少小时日期
2010-08-03 16:50
gdzhan
Rank: 2
等 级:论坛游民
帖 子:90
专家分:14
注 册:2007-4-15
收藏
得分:0 
是二楼兄弟那样理解的,
我举个例子吧:
法定上班是22天的,,,,如果一个员这个月上了25天,那么就有3天是法定加班的,这三天的工资是算2倍的,,因为人家老板是想发少点工资吗,所以要在这25天中找出出勤小时最少的3天来算2倍的工资,(注意:这也不是定是3天,有可能人家出勤了28天,那么就有6天是算2倍加班的,也就是说要在这个月中找出出勤小时最少的那6天来算2倍工资的,3倍的话就不用这样做了,3倍的工资直接按国家规定的日期来做就可以,关健是算这个2倍的,所以有点难度,还得注意:是用SQL语句来写的,没有涉及到其它的软件开发语言,所以灵活性又缩小了)我之前以为可以这样做,但是行不通,如下:

2倍天数:= (实际出勤天数-22)
2倍天数=(case when 2倍天数>0 then 2倍天数 else 0 end)
2倍天数=select SUM(top (case when 2倍天数=1 then 1 when 2倍天数=2 then 2 when........ else 0 end))
我之前就是这样做,,代码大概就是这个写法的,,原因是top m,,,这个m是不能够那样获得的,只能用一个数字来做的,如,top 3,top 5 这样才可以的,

2010-08-03 21:17
烟雨袅袅
Rank: 6Rank: 6
来 自:星空雨际
等 级:侠之大者
威 望:1
帖 子:430
专家分:494
注 册:2007-11-26
收藏
得分:5 
declare @i nvarchar(50);
select @i='8'
select top (SELECT CONVERT(int,@i)) * from Power_User
sql2008通过
2010-08-04 08:47
烟雨袅袅
Rank: 6Rank: 6
来 自:星空雨际
等 级:侠之大者
威 望:1
帖 子:430
专家分:494
注 册:2007-11-26
收藏
得分:8 
单条语句可写成
declare @i nvarchar(50);select @i='8';select top (SELECT CONVERT(int,@i)) * from 表
三条语句写成一条语句中,用分号隔开
2010-08-04 08:50
gdzhan
Rank: 2
等 级:论坛游民
帖 子:90
专家分:14
注 册:2007-4-15
收藏
得分:0 
我的是SQL2000,,,不能通过,唉,真郁闷,,,

2010-08-04 13:06
gdzhan
Rank: 2
等 级:论坛游民
帖 子:90
专家分:14
注 册:2007-4-15
收藏
得分:0 
今天想了一下,,突然找到解决办法了:

select * from mytable where fdate not in (select top 22 fdate from mytable where fdate between d1 and d2 order by mynum desc)

先查下22天中最大的小时的记录,再用一个查询查这个月中不在这22天中的记录,就是最小的那几条了,,一下子明白了,搞这东西,搞得久了头会晕,
过几天又会头脑清了。

2010-08-04 15:04
dearwolf4128
Rank: 5Rank: 5
来 自:陕西西安
等 级:职业侠客
威 望:6
帖 子:79
专家分:365
注 册:2010-7-2
收藏
得分:0 
回复 8楼 gdzhan
好样的,有时人会晕的,哈哈!
2010-08-05 11:43
autobot
Rank: 4
等 级:业余侠客
帖 子:71
专家分:202
注 册:2007-9-6
收藏
得分:0 
应该先判断一下是不是有人超过22天的正常工作日,然后再找那超过的三天到九天

select time top((select count(*) from 上班时间的表 where 是否上班的字段 = 1(表示今天上班了))- 22) from 上班时间的表 order by time desc
2010-08-12 15:28
快速回复:一个有挑战性的查询问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025997 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved