当存在非零值时,更新查询仅显示零值。 (访问)

时间:2018-10-25 19:57:26

标签: sql ms-access

我已经为此努力了几个小时。我正在尝试更新具有相同“ SHORT#”的所有值。如果“ SHORT#”位于 017_PolWpart2 中,则我希望它是更新 017_WithdrawalsYTD_changelater中相应的“ SHORT#”的值。此更新查询仅显示零,但实际上这些值非零。

所以说 017_WithdrawalsYTD_changelater 看起来像这样:

SHORT# WithdrawalsYTD
1          0
2          0
3          0
4          0
5          0

017_PolWpart2 看起来像这样:

SHORT# Sum_MTD_AGG
3          50
5          12

我想要这个:

SHORT# WithdrawalsYTD
1          0
2          0
3          50
4          0
5          12

但是我明白了:

SHORT# WithdrawalsYTD
1          0
2          0
3          0
4          0
5          0

我在下面的查询中附加了SQL。

谢谢!

UPDATE 017_WithdrawalsYTD_changelater 
INNER JOIN 017b_PolWpart2 ON [017_WithdrawalsYTD_changelater].[SHORT#] = 
                 [017b_PolWpart2].[SHORT#] 
SET [017_WithdrawalsYTD_changelater].WithdrawalsYTD = [017b_PolWpart2].[Sum_MTD_AGG];

编辑: 由于我必须即时汇总,因此我尝试这样做。仍然摆脱各种错误。请注意,表 17a_PolicyWithdrawalMatch 的格式为:

SHORT# MTG_AGG     WithdrawalPeriod       PolDurY
1          3                 1            1
1          5                 1            0
2          2                 1            1
2          22                1             1

所以我汇总:

SHORT# MTG_AGG     
1          3                 
2          24      

并将这些汇总值放在 017_WithdrawalsYTD_changelater 中。

我试图这样:

SELECT [017a_PolicyWithdrawalMatch].[SHORT#], Sum([017a_PolicyWithdrawalMatch].MTD_AGG) AS Sum_MTD_AGG
WHERE ((([017a_PolicyWithdrawalMatch].WithdrawalPeriod)=[017a_PolicyWithdrawalMatch].[PolDurY]))
GROUP BY [017a_PolicyWithdrawalMatch].[SHORT#]
UPDATE 017_WithdrawalsYTD_changelater INNER JOIN 017a_PolicyWithdrawalMatch ON [017_WithdrawalsYTD_changelater].[SHORT#] = [017a_PolicyWithdrawalMatch].[SHORT#] SET 017_WithdrawalsYTD_changelater.WithdrawalsYTD =Sum_MTD_AGG;

我没有运气...我被告知SELECT语句使用保留字...:(

1 个答案:

答案 0 :(得分:1)

请考虑一下@ June7的注释,以避免在表中使用聚合数据,因为它会冗余地使用存储资源,因为此类数据可以轻松地实时查询。另外,由于这些合计值保存在静态表中,因此它们立即成为历史数据。

在MS Access中,更新查询必须源自不是聚合查询(read-only类型)的可更新对象。因此,它们不能在int main(){ for(int i=0;i<n;i++){ array[50]; } } 语句中使用。

但是,如果确实需要存储汇总数据,请考虑在UPDATE内使用domain functions,例如DSUM。下面假设 SHORT#是一个字符串列。

UPDATE

尽管如此,仍可以查询合计值并将其刷新为当前值。另外,请注意使用表别名来减少长表名的长度:

UPDATE [017_WithdrawalsYTD_changelater] c
SET c.WithdrawalsYTD = DSUM("MTD_AGG", "[017a_PolicyWithdrawalMatch]", 
                            "[SHORT#] = '" & c.[SHORT#] & "' AND WithdrawalPeriod = [PolDurY]")
相关问题