导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

急需sql语句算法,请大家帮心参与!!

ma_yan_jun_78 2006-01-20 08:19:23
现在2张表
等级 a 表
工号 等级名称 等级数 开始日期 结束日期
0180 3A 10 2005-7-1 2005-10-12
0180 3B 12 2005-10-13 2005-11-11
0180 3c 13 2005-11-12 null

a 表的数据规则是:同一工号内的等级名称依次向后排,开始时间必须是上一级别的结束日期的后一天,最后一次级别的结束日期是无限大的

职位 b 表
工号 岗位名称 岗位系数 开始日期 结束日期
0180 新员工 1 2005-1-1 2005-7-31
0180 普通员工 2 2005-8-1 2005-8-5
0180 优秀员工 3 2005-8-6 null

b 表的数据规则是:同一工号内的岗位名称依次向后排,开始时间必须是上一级别的结束日期的后一天,最后一次级别的结束日期是无限大的

想求的结果

工号为0180 从 2005-1-1 到2005-8-31 内相应的等级系数*相应的岗位系统*相应的天出=最后的综合数
31*1*10+5*2*10+5*3*10=560
...全文
112 点赞 收藏 8
写回复
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ma_yan_jun_78 2006-01-20
samfeng_2003(凤翼天翔) ()
您算的对
回复
ma_yan_jun_78 2006-01-20
samfeng_2003(凤翼天翔) ()
您算的对
回复
samfeng_2003 2006-01-20
select *,(datediff(d,开始日期,结束日期)+1)*岗位系数*等级数 from
(
select a.工号,a.岗位名称,a.岗位系数,case when a.开始日期<b.开始日期 then b.开始日期 else a.开始日期 end as 开始日期,
case when a.结束日期 is null then dateadd(d,-1,
dateadd(m,1,convert(char(8),a.开始日期,120)+'01')) else a.结束日期 end as 结束日期,b.等级数
from t_b a
inner join t_a b on a.开始日期 between b.开始日期 and b.结束日期
or a.结束日期 between b.开始日期 and b.结束日期
) a

这样算出来是这个结果
工号 岗位名称 岗位系数 开始日期 结束日期 等级数
-------------------- -------------------- ----------- ------------------------------------------------------ ------------------------------------------------------ ----------- -----------
0180 新员工 1 2005-07-01 00:00:00.000 2005-07-31 00:00:00.000 10 310
0180 普通员工 2 2005-08-01 00:00:00.000 2005-08-05 00:00:00.000 10 100
0180 优秀员工 3 2005-08-06 00:00:00.000 2005-08-31 00:00:00.000 10 780
回复
samfeng_2003 2006-01-20
应该是1190吧!

create table t_a
(工号 varchar(20),等级名称 varchar(20),等级数 int,开始日期 datetime,结束日期 datetime)

insert t_a
select '0180','3A',10,'2005-7-1','2005-10-12' union all
select '0180','3B',12,'2005-10-13','2005-11-11' union all
select '0180','3c',13,'2005-11-12',null

create table t_b
(工号 varchar(20),岗位名称 varchar(20),岗位系数 int,开始日期 datetime,结束日期 datetime)

insert t_b
select '0180','新员工',1,'2005-1-1','2005-7-31' union all
select '0180','普通员工',2,'2005-8-1','2005-8-5' union all
select '0180','优秀员工',3,'2005-8-6',null

select sum((datediff(d,开始日期,结束日期)+1)*岗位系数*等级数) from
(
select a.工号,a.岗位名称,a.岗位系数,case when a.开始日期<b.开始日期 then b.开始日期 else a.开始日期 end as 开始日期,
case when a.结束日期 is null then dateadd(d,-1,
dateadd(m,1,convert(char(8),a.开始日期,120)+'01')) else a.结束日期 end as 结束日期,b.等级数
from t_b a
inner join t_a b on a.开始日期 between b.开始日期 and b.结束日期
or a.结束日期 between b.开始日期 and b.结束日期
) a


drop table t_a,t_b


-----------
1190

(所影响的行数为 1 行)
回复
ma_yan_jun_78 2006-01-20
等级表与职位表关联是这样的,每一个员工,每天只有一个等级及一个岗位.
31天是这样算的 等级的最开始日期为2005年7月1号结束日期为2005年10月21号这段时间都算3A级别,职位表里2005年1月1号-2005年7月31号是新员工,那么他的 3A级员新员工岗位的日期应该是从2005年7月1号到2005年7月31号。
5*2*10 的5天是这样算的 2005月8月1号-5号 的岗位系数

第三个是我的解释失误,应该是datediff(dd,'2006-08-06','2005-08-31')

回复
mislrb 2006-01-20
31*1*10+5*2*10+5*3*10=560 ??

樓主
最後一個5*3*10天數怎麼會是5天呢?
應該是datediff(dd,'2006-08-06','2005-08-31')才對吧
回复
lw1a2 2006-01-20
等级和职位的时间期间没关系?
回复
$扫地僧$ 2006-01-20
31*1*10+5*2*10+5*3*10=560 ??
31 5 5 这个怎么得到的啊!?
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告