VBA SQL:根据记录计数更新记录

时间:2017-07-26 07:03:31

标签: sql vba ms-access

我有两个不同的表,我想根据几个条件更新其中一个。 我的表是:

表1

wget -O http://mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz
chmod u+x /tmp/install-tl-unx.tar.gz
cd /tmp && tar zxvf install-tl-unx.tar.gz
./install-tl

表2

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

我想使用公式

计算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将被忽略,因为有三个记录= 0,因此对于ID = 4,有两个记录= 0.

更新的表格将是 表1

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

所以我想用sql Query来做,但我不知道如何正确完成它。

我所做的代码如下:

Sql Query:

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

VBA代码:

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;

2 个答案:

答案 0 :(得分:1)

您在SQL语句中的计算似乎有些偏差。你想得到

  

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

您的SQL语句将为您提供

  

N2 = Mx - 总和(N2) - RN

您需要至少2个嵌套查询才能实现目标:

Query1将计算Table1.N2中每个单个ID的全部零。

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的所有值。

我还可以想到没有DFunction的另一种解决方案,但它会涉及更多嵌套查询和计算字段。

It should look like this

答案 1 :(得分:1)

我借助子查询在纯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查询窗口中单独运行子查询(第1行和最后一行除外),你就可以得到清晰的视图。并且您可以单独运行每个子查询。仍然无法理解然后首先在sql server中了解 SubQuery ,然后逐步完成此查询。

注意:你应该明白的是,你可以清楚地问这个问题。没有人不会为你/我们做代码工作。当我们遇到问题/错误/问题/未知事物时,他们会帮助我们,但是你从未尝试过,但是从来没有对整个功能有所帮助,你也不期望它。

希望它对你有所帮助。 (别忘了标记为答案和投票)

谢谢, Kavin.S