急!如何在PLSQL中实现X客户平均分配给Y个客户经理

dbcz444 2019-01-25 04:48:51
有一个表(比如表名:待分配号码表,有很多号码,比如100个:

号码
15300000
15300001
15300002
.
.
.
.
.
15300099

客户经理名称存在于表“客户经理表”,客户经理表如下:

客户经理名称
张三
李四
王五

要将这100个号码平均分配给3个客户经理跟踪,分配后格式如下:

号码 客户经理名称
15300000 张三
15300001 李四
15300002 王五
15300003 张三
15300004 李四
15300005 王五
.
.
.
请各位高手指教,急
.
...全文
277 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
小古伢 2019-01-28
  • 打赏
  • 举报
回复
可以先对号码进行rownum排序,用得到的序号%3取余,得到每个客户的row值,然后也对客户经理rownum排序,直接用两个序号关联即可。菜鸟拙见,还望斧正。
nayi_224 2019-01-28
  • 打赏
  • 举报
回复
with tab1 as (
select 15300000 + level num, level rn from dual connect by level <= 100
)
, tab2 as (
select 'A' name from dual union all
select 'B' name from dual union all
select 'C' name from dual 
)
, tab3 as (
select t1.*, row_number() over(order by t1.name) - 1 rn, count(1) over() ct from tab2 t1
)
select t1.num, t2.name from tab1 t1, tab3 t2 where mod(t1.rn, t2.ct) = t2.rn;
dbcz444 2019-01-28
  • 打赏
  • 举报
回复
引用 2 楼 weixin_44626556 的回复:
可以先对号码进行rownum排序,用得到的序号%3取余,得到每个客户的row值,然后也对客户经理rownum排序,直接用两个序号关联即可。菜鸟拙见,还望斧正。



能否有具体的指令过程?本人没有接触过这些PL/SQL,包括ORACLE(单位数据库就是用这个),只是为了方便统计一些单位的数据才逼着学这个,几十岁了,勉力而为……谢谢。
dbcz444 2019-01-28
  • 打赏
  • 举报
回复
引用 1 楼 卖水果的net 的回复:
NTILE 和 ROW_NUMBER 这两个分析函数,可以解决你的问题。


能否有具体的指令过程?本人没有接触过这些PL/SQL,包括ORACLE(单位数据库就是用这个),只是为了方便统计一些单位的数据才逼着学这个,几十岁了,勉力而为……谢谢。
nayi_224 2019-01-28
  • 打赏
  • 举报
回复
引用 6 楼 dbcz444 的回复:
[quote=引用 5 楼 nayi_224 的回复:]
with tab1 as (
select 15300000 + level num, level rn from dual connect by level <= 100
)
, tab2 as (
select 'A' name from dual union all
select 'B' name from dual union all
select 'C' name from dual 
)
, tab3 as (
select t1.*, row_number() over(order by t1.name) - 1 rn, count(1) over() ct from tab2 t1
)
select t1.num, t2.name from tab1 t1, tab3 t2 where mod(t1.rn, t2.ct) = t2.rn;
号码是没有顺序的,我是为了表达清楚才用了顺序,而且,也不一定是100个,请赐教……谢谢。[/quote] 这个sql就是动态的。你把tab1,tab2换成你的表,tab1的level列改成rownum。
dbcz444 2019-01-28
  • 打赏
  • 举报
回复
问题解决,虽然自己不太懂,写得有点繁琐,
1.用NTILE先分组
SELECT 缴费编号, 号码, 客户姓名, 通信地址, 装机地址, 欠费金额, 欠费月份, 分组, 分管人, 认领机构, 数据更新时间, 联系电话, 是否纯当月,NTILE(4)
OVER (ORDER BY 号码 ASC NULLS LAST) FROM aoneiyh;
2.再用分组对应的客户经理UPDATE来更新
谢谢各位。
dbcz444 2019-01-28
  • 打赏
  • 举报
回复
引用 5 楼 nayi_224 的回复:
with tab1 as (
select 15300000 + level num, level rn from dual connect by level <= 100
)
, tab2 as (
select 'A' name from dual union all
select 'B' name from dual union all
select 'C' name from dual
)
, tab3 as (
select t1.*, row_number() over(order by t1.name) - 1 rn, count(1) over() ct from tab2 t1
)
select t1.num, t2.name from tab1 t1, tab3 t2 where mod(t1.rn, t2.ct) = t2.rn;


号码是没有顺序的,我是为了表达清楚才用了顺序,而且,也不一定是100个,请赐教……谢谢。
卖水果的net 2019-01-25
  • 打赏
  • 举报
回复
NTILE 和 ROW_NUMBER 这两个分析函数,可以解决你的问题。

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧