日期:2014-05-17  浏览次数:20431 次

求SQL:替换一个字段
客户经理服务对照表T (大约5W行);

CUS_ID,CM_NAME,CUS_MOBILE
101,李强,1311234567
101,周倩,1321234567
101,张三,1331234567

102,NULL,1891234567
102,李四,1381234567
103,王五,1380000000
103,NULL, 1361234567

104,郭晓,1341234561
104,张雨,1321456123

---需要得到的结果如下:

CUS_ID,CM_NAME,CUS_MOBILE
101,李强,1311234567
101,李强,1321234567
101,李强,1331234567
102,李四,1891234567
102,李四,1381234567
103,王五,1380000000
103,王五, 1361234567
104,郭晓,1341234561
104,郭晓,1321456123

#业务是这样理解的:
每个业务经理CM_NAME,必须服务一批CUS_ID,但是又不能多个客户经理服务同一个CUS_ID,所以就有
了这个问题。
遵循原则:
1.如果一个CUS_ID原来有多个客户经理服务,那么就随机取一个,取第一个也行,如:101
2.如果一个CUS_ID新增加一个手机号码,但是人还是一个嘛,所以CM_NAME要保持原来的,如:102
3.技术要求直接更新表T就行,不用写临时表

谢谢各位支招!!!
------解决方案--------------------
;with cte as(
select row_number() over (partition by CUS_ID order by getdate()) m,* from #a  
)
select CUS_ID, (select top 1 CM_NAME from cte where CUS_ID=a.CUS_ID and  isnull(CM_NAME,'')!=''  order by m )CM_NAME 
 ,CUS_MOBILE from    cte a order by CUS_ID
----查询结果
(9 行受影响)
CUS_ID      CM_NAME                                            CUS_MOBILE
----------- -------------------------------------------------- -----------
101         李强                                                 1311234567
101         李强                                                 1321234567
101         李强                                                 1331234567
102         李四                                                 1891234567
102         李四                                                 1381234567
103         王五