2017-07-26 68 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