【问题标题】:Sum with expression and group by in Access 2007 / VBAAccess 2007 / VBA中的表达式和分组求和
【发布时间】:2012-05-02 17:43:08
【问题描述】:

这是我开始使用的代码,它不太正确:

 UPDATE mt
 SET mt.action = 'A', mt.TQA = TRUE,
     mt.OPID = 'SYS', mt.rc= 'DAR', mt.h='DAR'
 WHERE EXISTS 
 (
     SELECT mt.Account FROM mt AS pm
     WHERE mt.Account = pm.Account
     GROUP BY pm.Account, pm.[amount] + Nz(pm.[SFS],0)
     HAVING (pm.[amount] + Nz(pm.[SFS],0) > 500)
 );

我需要的是帐户所有实例的金额和 SFS 的总和,其中超过 500。

例如,如果我有下表

 Account   Amount   SFS
 123       350.00   0.00
 123       125.00   125.00
 123       350.00   0.00
 123       125.00   125.00
 234       1600.00  5.00
 345       2.50     4.60

我应该得到

 123    1200.00
 234    1605.00

我从上面的代码中得到的只是不同的总数,而不是组,这意味着它们不会被 >500 捕获:

 123    350.00
 123    250.00
 234    1605.00

有人可以帮忙吗?这让我们 5 人感到难过。

【问题讨论】:

  • 很公平。当我输入标签时,我在想“这将通过 vba 使用”,但它实际上不在问题中,所以你是对的。谢谢。

标签: sql group-by ms-access-2007 sum


【解决方案1】:

从 group by 子句中删除 pm.[amount] + Nz(pm.[SFS],0) - 您不想按总和分组,只按帐户分组

【讨论】:

  • 我同意,但是当我使用子查询执行此操作时(假设更新正常),Access 给我以下错误:您尝试执行不包含指定表达式的查询 '(pm .amount+nz(pm.sfs,0)>500' 作为聚合函数的一部分。
  • 这是相关的:SELECT 字段列表中的所有字段都必须包含在 GROUP BY 子句中,或者作为 SQL 聚合函数的参数包含在内。尝试新事物...
【解决方案2】:

也许这就是你要找的:

UPDATE mt
SET mt.action = 'A', mt.TQA = TRUE,
    mt.OPID = 'SYS', mt.rc= 'DAR', mt.h='DAR'
WHERE EXISTS 
(
    SELECT mt.Account FROM mt AS pm
    WHERE mt.Account = pm.Account
    GROUP BY pm.Account, pm.[amount] + Nz(pm.[SFS],0)
    HAVING (SUM(pm.[amount] + Nz(pm.[SFS],0)) > 500)
);

【讨论】:

  • 不 - 与 Sean 推荐的问题相同,据我所知。不过我确实找到了解决方案!即将发布。
【解决方案3】:

我需要使用两个子查询。这是最后的结果。

UPDATE mt
SET rc='DAR'
WHERE  Account IN
(
  SELECT mt.account
  FROM 
    (
    SELECT mt.Account, SUM(mt.[amount]+Nz(mt.[SFS],0)) as total
    FROM mt
    GROUP BY mt.Account
    )    
  WHERE total>=500
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    相关资源
    最近更新 更多