2017-08-03 135 views
-1

我有3个表:记录从一个表到另一个

Users 
----- 
UserID (varchar) 
Active (bit) 

Refunds_Upload 
-------------- 
BorrowerNumber (varchar) 

Refunds 
------- 
BorrowerNumber 
UserID 

我首先选择的所有用户ID值,其中活跃= 1

我需要插入从Refunds_Upload到退款记录但是我需要为每个活动用户ID插入相同(或尽可能接近)的记录数。
例如,如果Refunds_Upload有20条记录,并且Users表有5个人,其中Active = 1,那么我需要在表Refunds中插入每个UserID 4条记录。

最终结果将是:

BorrowerNumber UserID 
105    Fred 
110    Fred 
111    Fred 
115    Fred 
120    Billy 
122    Billy 
123    Billy 
125    Billy 
130    Lucius 
131    Lucius 
133    Lucius 
135    Lucius 
138    Lucy 
139    Lucy 
140    Lucy 
141    Lucy 
142    Grady 
143    Grady 
144    Grady 
145    Grady 

当然,它不会总是为偶数的每个用户的记录,所以我需要考虑到这一点。

+0

在你的最终结果为什么每个用户的BorrowerNumber是不一样的? –

回答

2

首先运行这一点,并检查它返回像要插入,取消注释插入之前什么,实际执行出来..

--INSERT INTO Refunds 

SELECT 
    numbered_u.UserID, 
    numbered_ru.BorrowerNumber 
FROM 
    (SELECT u.*, ROW_NUMBER() OVER(ORDER BY UserID) - 1 as rown, SUM(CAST(Active as INT)) OVER() as count_users FROM Users u WHERE active=1) numbered_u 
    INNER JOIN 
    (SELECT ru.*, ROW_NUMBER() OVER(ORDER BY BorrowerNumber) - 1 as rown, COUNT(*) OVER() as count_ru FROM Refund_Uploads ru) numbered_ru 
    ON 
    ROUND(CAST(numbered_ru.rown AS FLOAT)/(count_ru/count_users)) = numbered_u.rown 

逻辑:

我们数量每年都有趣(活动= 1)用户行,我们也统计他们。这应该返回我们所有5个用户,编号为0到4,并且每行的ctr为5。

然后,我们将它们加入到Refund_Uploads的相似编号列表(比如20)。同样,出于数学原因,这些行将被编号为0到19,这些将在后面变得明显。我们也计算所有这些行

然后我们将这两个数据集连接在一起,但条件是一个值范围而不是精确值。逻辑是“refund_upload行号,除以the_count_of_rows_there_should_be_per_user”(即0..19 /(20/5))= user_row_number。因此希望退还第0行至第3行,与用户0关联,退还第4至第7行与用户1关联..等等

如果没有完整的数据,调试有点困难 - 我觉得它可能需要几个+1/- 1在这里和那里调整。

我最初使用FLOOR但切换到使用ROUND,因为我认为这可能适用于在Refund/User中没有整数个分区的情况下分配数字集。你的240/13例子..希望有些用户将有18行和一些19

+0

感谢您的回复。我看到:Msg 107,Level 15,State 1,Line 5 列前缀'u'与查询中使用的表名或别名不匹配。 消息8155,级别16,状态2,行6 未为'编号_u'的列1指定列名称。 – user3641053

+0

已修复,不好意思..这是内部查询的别名问题 –

+0

谢谢。我现在回来了:消息8117,级别16,状态1,行5 操作数数据类型位对求和算子无效。 – user3641053

相关问题