2017-07-26 93 views
0

我有兩個不同的表,我想基於幾個條件更新其中之一。 我的表是:VBA SQL:基於記錄數的更新記錄

表1

--------------------------- 
ID |  N1 | N2 
--------------------------- 
1   22  12 
1   5  0 
1   87  12 
2   67  0 
2   6  0 
2   3  0 
2   60  12 
3   55  0 
3   64  12 
4   8  0 
4   75  12 
4   4  0 
5   58  12 
5   69  12 
5   36  12 
5   3  0 

表2

-------------------------- 
ID |  MX | RN 
-------------------------- 
1   33  2 
2   45  3 
3   99  4 
4   67  2 
5   87  4 

欲僅使用式

計算那些具有一個N 2 = 0在表1

N2 = MX-N1-RN

因此,例如,當ID = 1僅存在一個0,所以我們將總結所有的N1不在0

N2 = 33-(87 + 22)-2 = -78

和在ID = 3相同並= 5

N2 = 99-(64)-4 = 31

N2 = 87-(58 + 69 + 36)-4 = -80

然後該ID的N2將被更新爲新記錄。 ID = 2將被忽略,因爲有三個記錄= 0,所以對於ID = 4,有兩個記錄= 0。

更新後的表將 表1

--------------------------- 
ID |  N1 |  N2 
--------------------------- 
1   22  12 
1   5  -78 
1   87  12 
2   67   0 
2   6   0 
2   3   0 
2   60  12 
3   55  31 
3   64  12 
4   8   0 
4   75  12 
4   4   0 
5   58  12 
5   69  12 
5   36  12 
5   3  -81 

,所以我想用SQL查詢來做到這一點,但我不知道如何正確地完成它。

我做的代碼如下:

SQL查詢:

UPDATE TABLE1 AS I INNER JOIN TABLE2 AS P ON I.ID = P.ID 
SET I.N2 =P.MX- SUM(I.N2)- (P.RN) 
WHERE (SELECT COUNT(S.ID) FROM TABLE1 AS S 
WHERE S.ID = " & [S.ID] & " 
AND N2 = 0) =1; 

VBA代碼:

Private Sub GET_CAL() 
    DoCmd.SetWarnings False 
    DoCmd.OpenQuery "Query1" 
    DoCmd.SetWarnings True 
End Sub 
+0

你的計算是混亂的,對於ID = 1,您要添加N2的N1值!= 0,但對於ID = 3,你得到N2 = 0的N1值。爲什麼?這裏你也應該把N2!= 0的N1值對嗎?即N2 = 33-(64)-2 = -33。 – Kavin

+0

對不起,這是我的錯。我糾正了它。 –

+0

再犯錯誤你提到ID = 2,3的計算。您提到ID = 2和3的錯誤MX和RN值。 它應該如下 對於ID = 2,N2 = 99-(64)-4 = 31, 對於ID = 3,N2 = 87- (58 + 69 + 36)-4 = -80 – Kavin

回答

1

你的SQL語句中的計算似乎有點過。你想獲得

N2 =的Mx - 總和(N1 = 0) - RN

你的SQL語句會給你

N2 =的Mx - 總和(N2) - RN

至少需要2個嵌套查詢來實現自己的目標:

曲對於每個單個ID,ery1將計算Table1.N2中的所有零。

Query2將只給出那些只有一個對應的N2爲零的ID。

兩者都嵌套在UPDATE查詢中。然後,您可以使用使用DLookup和DSUM得到你需要的東西:

UPDATE Table1 As t3 
SET t3.N2 = DLookUp("MX","Table2","ID = " & t3.ID) - 
DSum("N1","Table1","ID = " & t3.ID & " And N2 <>0") - 
DLookUp("RN","Table2","ID = " & t3.ID) 
WHERE t3.N2 = 0 And t3.[ID] 
     In (SELECT t2.ID 
      FROM (SELECT t1.ID, t1.N2 
       FROM Table1 AS t1 
       WHERE t1.N2 = 0) AS t2 
      GROUP BY t2.ID 
      HAVING Count(t2.N2)=1) 

使用DLookup會得到相應的MX和RN值。 DSum函數將總結相應ID的所有值,其中N2不爲0.

我也可以考慮沒有DFunctions的另一個解決方案,但它會涉及更多帶有計算字段的嵌套查詢。

It should look like this

+0

我不想總結其中N2 = 0如果有多於0爲每個ID。 –

+0

我試着運行ur查詢,它爲所有的賦值爲空值。 –

+0

我對N2 = 0的錯誤。不知道爲什麼你會得到空值。它對我來說工作得非常好,儘管按計劃更新了更多。請檢查更新的答案,它應該解決您的問題。 –

0

我導出了純SQL查詢與子查詢的幫助。這個查詢將爲你完美工作。

UPDATE Table_1 SET N2= t3.N2 FROM 

(SELECT t1.ID,t2.SumOfN1,t1.MX,t1.RN (t1.MX-t2.SumOfN1-t1.RN)N2 FROM 

(SELECT * FROM Table_2 WHERE ID in (SELECT ID FROM Table_1 WHERE N2=0 GROUP BY ID HAVING(COUNT(ID)<=1)))t1, 
(SELECT ID,SUM(N1)SumOfN1 FROM Table_1 WHERE N2!=0 GROUP BY ID)t2 

WHERE t1.id=t2.id)t3 


WHERE Table_1.ID=t3.ID and Table_1.N2=0 

上述查詢將滿足您的需求。如果你想知道它是如何派生的,那麼在SQL Server查詢窗口中單獨運行子查詢(除了第一行和最後一行),你就可以獲得清晰的視圖。並且可以分別運行每個子查詢。仍然不能理解,然後首先在sql server中瞭解SubQuery,然後遍歷此查詢。

注意:事情是你應該明白,你可以清楚地問問題。沒有人不會爲你/我們做代碼工作。他們會幫助我們,而我們堅持從你嘗試過的問題/錯誤/問題/未知的事情,但從來沒有幫助過整個功能,也不期望它。

希望它對你有幫助。 (別忘了標記爲答案,表決)

感謝, Kavin.S

+0

謝謝你的回答,但有一件事我不明白,在第一行,我們可以使用'FROM'與我們的更新?因爲我從來沒有做過? 'UPDATE Table_1 SET N2 = t3.N2 FROM' ..它給我的語法錯誤。 –

+0

顯然,應該可以在UPDATE查詢中使用FROM。例如,查看https://stackoverflow.com/questions/13881649/update-statement-using-nested-query。但是,它不是我的Access版本,因爲我得到一個語法錯誤。也許它在某個時候被添加/刪除了? –

+0

我們可以在Sql server中使用FROM和update,但是我沒有Access的經驗。所以我不知道爲什麼它不工作。你可以在谷歌搜索這個錯誤,並找到並使用,而不是。 – Kavin