在开发一个客户的业务员提成软件时。
该公司的业务员提成率与“职务”相关。
比如:经理提成 10%,主管提成 8%,主任提示 7%
小张,1月份是经理 ,2月份是经理,3月份是 主任,4月份是经理,5月是经理,6月是主任,7月是主任,8月是主任,9月是主任,10月是主任
如果在保存数据时如果每一个月都存入一个数据的话,明显相当于写入了大量的垃圾;
所以,存过数据表中的数据就应该是:
小张,1月经理,3月主任,4月经理,6月主任
也就是说,要删除连接重复的行,仅保留重复的第一行
如表A有以下数据
工号 生效日期 职务
9 2012-05-01 00:00:00副主任
9 2012-06-01 00:00:00副主任
9 2012-07-01 00:00:00高级业务代表
9 2012-08-01 00:00:00副主任
9 2012-09-01 00:00:00副主任
9 2012-10-01 00:00:00副主任
9 2012-11-01 00:00:00暂定资深主任
9 2012-12-01 00:00:00副经理
10 2012-05-01 00:00:00业务助理
10 2012-06-01 00:00:00高级业务代表
10 2012-07-01 00:00:00业务代表
10 2012-08-01 00:00:00高级业务代表
10 2012-09-01 00:00:00副主任
10 2012-10-01 00:00:00副主任
10 2012-11-01 00:00:00高级业务代表
10 2012-12-01 00:00:00高级业务代表
要得到以下结果:
工号 生效日期 职务
9 2012-05-01 00:00:00副主任
9 2012-07-01 00:00:00高级业务代表
9 2012-08-01 00:00:00副主任
9 2012-11-01 00:00:00暂定资深主任
9 2012-12-01 00:00:00副经理
10 2012-05-01 00:00:00业务助理
10 2012-06-01 00:00:00高级业务代表
10 2012-07-01 00:00:00业务代表
10 2012-08-01 00:00:00高级业务代表
10 2012-09-01 00:00:00副主任
10 2012-11-01 00:00:00高级业务代表
要得到这样的结果,巧妙的利用一下 自动编号 的功能就可以非常简的实现,
原理就是让完全两同的两个表,通过 Left join 错位(1行)连接,然后比较错位后的职业,不相同的则留下来即可。
(注意,不要遗忘了错位后右表会出来一行NULL行。这也是我们要的数据)
SELECT 编号=IDENTITY(INT,1,1), * INTO #TEMP FROM 表A ORDER BY 工号,生效日期
SELECT A.工号,A.生效日期,A.职务
FROM #TEMP A LEFT JOIN #TEMP B ON A.编号 = B.编号 +1
WHERE ISNULL(B.编号,0)=0 OR A.职务 <> B.职务
是不是很简单???