我有两个不同的表,我想根据几个条件更新其中一个。 我的表是:
表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;
答案 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的另一种解决方案,但它会涉及更多嵌套查询和计算字段。
答案 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