【问题标题】:Sum a column of fields from an ado-query result?从 ado 查询结果中求和一列字段?
【发布时间】:2011-10-29 14:25:23
【问题描述】:

好的,所以我正在创建一个程序,它使用 dbgrid 和 ado-queries 来处理 Microsoft access 数据库中的表。

该计划是为具有忠诚度计划的企业设计的,会员可以注册,并且必须跟踪购买。这是包含事务的表:

现在我要做的是运行一个 ado 查询,该查询将从该表中选择某个成员 ID,然后我想从 adoquery 的结果中添加所有“PointsAwarded”。所以我可以得到一个会员获得的总积分。

这似乎很难完成,因为我已经搜索了几天,但没有找到任何有用的东西。

感谢您的帮助!

【问题讨论】:

  • 为什么这个标签被标记为 [delphi]?
  • 因为它使用 TADOQuery? :)

标签: sql delphi sum


【解决方案1】:

如果您知道要寻找什么,这并不难。 :)

您可以按某些列分组,然后在其他列上使用聚合函数。在这种情况下,我将每个 MemberId 的所有记录分组在一起以获得奖励积分的总和:

select
  t.MemberId,
  sum(t.PointsAwarded) as TotalPoints
from
  Transactions t
group by
  t.MemberId

【讨论】:

    【解决方案2】:

    如果您想获得所有成员的总 PointsAwarded,请使用 Golez 的答案。

    如果您想要特定会员的 PointAwarded,那么您只需执行以下操作:

    SELECT SUM(PointsAwarded) AS TotalPointsAwarded
    FROM Transactions
    WHERE MemberID = 3
    

    上面的例子得到了成员 3 的总数。

    您需要对查询进行参数化,以便您可以传入成员 ID 的变量。

    您需要阅读有关组件参数属性的文档,因为它在 Delphi 版本之间有所不同。

    但是,一旦您将查询参数化,然后当您调用查询时,您就会这样做,其中 MyADOQuery 是您的组件的名称:

    MyADOQuery.Active := False;
    MyADOQuery.Parameters.ParamByName('MemberID').Value := 3;
    MyADOQuery.Active := True;
    

    【讨论】:

    • 如果查询与您在此处建议的一样简单,那么也许没有必要像那样切换Active 状态。只需将参数设置为新值并执行MyADOQuery.Requery;。也就是说,如果知道该组件目前处于活动状态。如果不能保证,那么可能会这样做:if MyADOQuery.Active then MyADOQuery.Requery else MyADOQuery.Open;.
    猜你喜欢
    • 2014-04-11
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多