[英]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.