大神求解:把一张表的数据根据另一张表里面进行分配

zxf611116 2014-12-18 11:47:46
有两张表,一张表里面是ID和数据 <用户ID>表,如下表

用户ID 数值
A1 500
A2 1000
A3 1500

还有一张表是<分配表>,如图

数据序列 数据值
m1 2000

现在想实现关联,然后将<分配表>的数据关联到<用户ID表>中去,实现

用户ID 数值 数据序列 数据值
A1 500 m1 500
A2 1000 m1 1000
A3 1500 m1 1500

求大神帮助啊,救急!!

...全文
176 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
还在加载中灬 2014-12-18
  • 打赏
  • 举报
回复
说实话,我除了全连接的样子外,看不出楼主的数据有啥要处理的地方
Tiger_Zhao 2014-12-18
  • 打赏
  • 举报
回复
SELECT a.用户ID,a.数值,b.数据序列,a.数值 AS 数据值
FROM 用户ID表 a, 分配表 b
Tiger_Zhao 2014-12-18
  • 打赏
  • 举报
回复
WITH a(Code,ReqNum) AS (
SELECT 'A', 500 UNION ALL
SELECT 'B',1000 UNION ALL
SELECT 'C',1500 UNION ALL
SELECT 'D', 500 UNION ALL
SELECT 'E',1000 UNION ALL
SELECT 'F', 500
)
,b(SN,Value) AS (
SELECT 'm7',1200 UNION ALL
SELECT 'm8',1800 UNION ALL
SELECT 'm9',2000
)
,a1 AS (
SELECT *,
ROW_NUMBER() OVER(ORDER BY Code) rn
FROM a
)
,b1 AS (
SELECT *,
ROW_NUMBER() OVER(ORDER BY sn) rn
FROM b
)
,r AS (
-- 第一条
SELECT a1.Code,
a1.ReqNum,
b1.SN,
CASE WHEN a1.ReqNum <= b1.value THEN
a1.ReqNum
ELSE
b1.value
END AS AssignNum,
b1.value - a1.ReqNum AS RemainNum,
a1.rn AS a_rn,
b1.rn AS b_rn
FROM a1,b1
WHERE a1.rn = 1
AND b1.rn = 1
UNION ALL -- 分配有剩余,继续下一个用户
SELECT a1.Code,
a1.ReqNum,
r.SN,
CASE WHEN a1.ReqNum <= r.RemainNum THEN
a1.ReqNum
ELSE
r.RemainNum
END AS AssignNum,
r.RemainNum - a1.ReqNum AS RemainNum,
a1.rn AS a_rn,
r.b_rn
FROM r
JOIN a1
ON a1.rn = r.a_rn + 1
WHERE r.RemainNum > 0
UNION ALL -- 分配不足,继续下一个分配序列
SELECT r.Code,
r.ReqNum,
b1.SN,
CASE WHEN ABS(r.RemainNum) <= b1.value THEN
ABS(r.RemainNum)
ELSE
b1.value
END AS AssignNum,
b1.value - ABS(r.RemainNum) AS RemainNum,
r.a_rn,
b1.rn AS b_rn
FROM r
JOIN b1
ON b1.rn = r.b_rn + 1
WHERE r.RemainNum < 0
UNION ALL -- 正好分配完,两边都继续下一个
SELECT a1.Code,
a1.ReqNum,
b1.SN,
CASE WHEN a1.ReqNum <= b1.value THEN
a1.ReqNum
ELSE
b1.value
END AS AssignNum,
b1.value - a1.ReqNum AS RemainNum,
a1.rn AS a_rn,
b1.rn AS b_rn
FROM r
JOIN a1
ON a1.rn = r.a_rn + 1
JOIN b1
ON b1.rn = r.b_rn + 1
WHERE r.RemainNum = 0
)
SELECT *
FROM r
--OPTION (MAXRECURSION 1000)

Code      ReqNum SN     AssignNum   RemainNum                 a_rn                 b_rn
---- ----------- ---- ----------- ----------- -------------------- --------------------
A 500 m7 500 700 1 1
B 1000 m7 700 -300 2 1
B 1000 m8 300 1500 2 2
C 1500 m8 1500 0 3 2
D 500 m9 500 1500 4 3
E 1000 m9 1000 500 5 3
F 500 m9 500 0 6 3
zxf611116 2014-12-18
  • 打赏
  • 举报
回复
引用 9 楼 ky_min 的回复:
这个用SQL有CTE递归可以做到,但是,如果在程序上处理更好,只需要遍历一次就全部出来了
可以写个大概的语句吗,我学习下,程序不会啊
还在加载中灬 2014-12-18
  • 打赏
  • 举报
回复
这个用SQL有CTE递归可以做到,但是,如果在程序上处理更好,只需要遍历一次就全部出来了
zxf611116 2014-12-18
  • 打赏
  • 举报
回复
引用 7 楼 ky_min 的回复:
你这个太工整了,如果分配表的第一条是2800,第二条还是2000,那结果是怎么样子的
基本上都是整数,跟工整的,跟这个表类似,当第一个不够时候,就在第二个里面选
还在加载中灬 2014-12-18
  • 打赏
  • 举报
回复
你这个太工整了,如果分配表的第一条是2800,第二条还是2000,那结果是怎么样子的
zxf611116 2014-12-18
  • 打赏
  • 举报
回复
引用 5 楼 ky_min 的回复:
如果分配表有两条呢?
还有你的示例数据,第三条应该是500吧

期望你更多的示例数据和期望结果


是的,我打错了,总数应该是3000

示例有


还在加载中灬 2014-12-18
  • 打赏
  • 举报
回复
如果分配表有两条呢? 还有你的示例数据,第三条应该是500吧 期望你更多的示例数据和期望结果
zxf611116 2014-12-18
  • 打赏
  • 举报
回复
引用 1 楼 Tiger_Zhao 的回复:
SELECT a.用户ID,a.数值,b.数据序列,a.数值 AS 数据值
  FROM 用户ID表 a, 分配表 b
这个只能关联起来,怎么把2000按照用户ID表 的数值进行分配呢
zxf611116 2014-12-18
  • 打赏
  • 举报
回复
引用 2 楼 ky_min 的回复:
说实话,我除了全连接的样子外,看不出楼主的数据有啥要处理的地方
需要将<分配表>中的2000,根据<用户ID>里面的数值,进行分配下,我现在只能关联起来,但是根据数据分配做不起来

22,209

社区成员

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

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