2017-08-03 149 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

相關問題