簡體   English   中英

VBA SQL:根據記錄數更新記錄

[英]VBA SQL: update record based on the count of record

我有兩個不同的表,我想根據幾種情況更新其中之一。 我的表是:

表格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

我只想使用公式計算table1中N2 = 0的那些

N2 = MX-N1-RN

因此,例如,當ID = 1時,只有一個0,所以我們將所有非0的N1相加

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將被忽略,因為有3條記錄= 0,因此對於ID = 4有2條記錄= 0。

更新后的表將是Table1

---------------------------
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 Query來做,但是我不知道如何正確地完成它。

我完成的代碼如下:

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

您在SQL語句中的計算似乎有些偏離。 你想得到

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

您的SQL語句會給您

N2 = Mx-總和(N2)-RN

您至少需要2個嵌套查詢才能實現目標:

Query1將為每個單個ID計算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函數將匯總N2不為0的相應ID的所有值。

我也可以想到另一種沒有DFunctions的解決方案,但是它將涉及更多帶有計算字段的嵌套查詢。

它應該看起來像這樣

我已經在子查詢的幫助下以純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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM