sql语句将数据平均修改到地区

qq_42657389 2018-07-10 12:38:03
用户表
ID 姓名 省 市 区
1 张三 10000
2 李四 10000
.........

省表
ID 编号 名字
1 10000 广州

市表
ID 编号 名字 省
1 100100 东莞 10000
2 100200 深圳 10000
...


区县表
ID 编号 名字 市
1 100110 石碣镇 100100
2 100120 石龙镇 100100
3 100210 福田区 100200
4 100220 光明新区 100200
.....

比如用户表有一百个人,把这个一百个人地区信息平均修改到广州省下面的所有市和区
...全文
138 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
二月十六 2018-07-11
  • 打赏
  • 举报
回复
引用 5 楼 qq_42657389 的回复:
[quote=引用 1 楼 sinat_28984567 的回复:]
平均修改到广州省下面的所有市和区
这个怎么算平均,如果要是10各地区两个人呢?就是地区比人多呢

能写吗?大佬[/quote]
--测试数据
if not object_id(N'Tempdb..#用户表') is null
drop table #用户表
Go
Create table #用户表([ID] int,[姓名] nvarchar(22),[省] nvarchar(22),[市] nvarchar(22),[区] nvarchar(22) )
Insert #用户表
select 1,N'张三',10000,null,null union all
select 2,N'李四',10000,null,null union all
select 3,N'王五',10000,null,null union all
select 4,N'赵六',10000,null,null
GO
if not object_id(N'Tempdb..#区县表') is null
drop table #区县表
Go
Create table #区县表([ID] int,[编号] nvarchar(23),[名字] nvarchar(23),[市] int)
Insert #区县表
select 1,'100110',N'石碣镇',100100 union all
select 2,'100120',N'石龙镇',100100 union all
select 3,'100210',N'福田区',100200
Go
--测试数据结束
SELECT t1.ID,
t1.姓名,
t1.省,
t2.市,
t2.编号
FROM
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY SUBSTRING(省, 1, 3) ORDER BY ID) AS rn1
FROM #用户表
) t1
JOIN
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY SUBSTRING(编号, 1, 3) ORDER BY ID) - 1 AS rn1,
COUNT(1) OVER (PARTITION BY SUBSTRING(编号, 1, 3)) AS rn2
FROM #区县表
) t2
ON t2.rn1 = t1.rn1 % t2.rn2;


shinger126 2018-07-10
  • 打赏
  • 举报
回复
;with T as(select row_number() over(order by NEWID()) rn,a.* from
区县表 a join 市表 b on a.市=b.编号
join 省表 c on b.省=c.编号 where c.名字='广州' ),
CT AS (select count(*) cts from T),
M as (select row_number() over (order by newid()) rn,* from 用户表),
U as (select case when rn%cts=0 then cts else rn%cts end rn1,M.* from M,CTS)
select * from T,U where t.rn=U.rn1

guguda2008 2018-07-10
  • 打赏
  • 举报
回复
UPDATE T3 SET T3.省=T2.省编号,T3.市=T2.市编号,T3.区=T2.区编号
FROM (
SELECT ID,ROW_NUMBER() OVER(ORDER BY NEWID())%T2.QU_NUM+1 AS 区_NUM
FROM 用户表 T1
OUTER APPLY (
SELECT COUNT(1) AS QU_NUM FROM 区县表
) T2
) T1
INNER JOIN (
SELECT ROW_NUMBER() OVER(ORDER BY T1.ID) AS 区_NUM,T1.编号 AS 区编号,T2.编号 AS 市编号,T2.省 AS 省编号
FROM 区县表 T1
INNER JOIN 市表 T2 ON T1.市=T2.编号
) T2 ON T1.区_NUM=T2.区_NUM
INNER JOIN 用户表 T3 ON T1.ID=T3.ID

懒得写测试数据了,自己试试行不行吧
qq_42657389 2018-07-10
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
平均修改到广州省下面的所有市和区
这个怎么算平均,如果要是10各地区两个人呢?就是地区比人多呢

能写吗?大佬
qq_42657389 2018-07-10
  • 打赏
  • 举报
回复
引用 2 楼 shinger126 的回复:
就算你要平均分配,也要有个规则啊,随机还是根据用户编号填充?

随机的
qq_42657389 2018-07-10
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
平均修改到广州省下面的所有市和区
这个怎么算平均,如果要是10各地区两个人呢?就是地区比人多呢

尽量平均 。地区多,那就有的地区不分配人。
shinger126 2018-07-10
  • 打赏
  • 举报
回复
就算你要平均分配,也要有个规则啊,随机还是根据用户编号填充?
二月十六 2018-07-10
  • 打赏
  • 举报
回复
平均修改到广州省下面的所有市和区
这个怎么算平均,如果要是10各地区两个人呢?就是地区比人多呢

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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