【问题标题】:SQL field as sum of other fieldsSQL 字段作为其他字段的总和
【发布时间】:2011-05-15 18:46:16
【问题描述】:

这与查询无关,我想知道是否可以将列中的字段显示为其他字段的总和。有点像 Excel。

例如,我有两个表:

食谱

nrecepie integer
name varchar(255)
time integer

和其他

说明

nintrucion integer
nrecepie integer
time integer

所以,基本上作为食谱有 n 条说明,我想要那个

recipes.time = sum(intructions.time)

这可以在创建表脚本中完成吗?如果有,怎么做?

【问题讨论】:

  • 我认为这不可能作为CREATE TABLE 声明的一部分。触发器用于这种功能,或者您可以编写存储过程来进行更新(添加/删除指令时)。
  • 我们在谈论什么样的环境? SQL 服务器?使用权? MySQL?

标签: sql field sum


【解决方案1】:

您可以使用视图:

CREATE VIEW recipes_with_time AS
SELECT nrecepie, name, SUM(Instructions.time) AS total_time
FROM Recepies
JOIN Instructions USING (nrecepie)
GROUP BY Recepies.nrecepie

如果您真的想在真实表中拥有该数据,则必须使用触发器。

【讨论】:

  • 老实说@Martin,这是您最好的方法,因为您知道这些值将始终是最新的。
  • 感谢您的输入,但我实际上需要在没有视图的情况下执行此操作。我将不得不使用触发器
【解决方案2】:

这可以通过INSERT/UPDATE/DELETE 触发器来完成。每次更改表Instructions 中的数据时,触发器都会运行并更新Recepies 中的时间value

【讨论】:

  • 谢谢,我会用触发器。不知道他们的存在。生病谷歌他们并学习:)
【解决方案3】:

您可以在每次更改指令表时使用触发器来更新时间列,但更“正常”(较少冗余)的方法是通过指令和之间连接上的 group by 子句计算时间列接收 [原文] 表。

【讨论】:

    【解决方案4】:

    一般来说,您希望避免这种情况,因为您要存储派生信息(出于性能原因,存在例外情况)。因此,最好的解决方案是按照 AndreKR 的建议创建视图。这提供了一个始终正确的总数,就像它在实际的存储列中一样容易从数据库中选择。

    【讨论】:

      【解决方案5】:

      取决于数据库供应商...例如,在 SQL Server 中,您可以创建一个列来根据同一行中其他列的值计算其值。它们被称为计算列,您可以这样做:

      Create Table MyTable
       (
           colA Integer,
           colB Integer,
           colC Intgeer,
           SumABC As colA + colB + colC
       )
      

      通常只需输入您想要的列名、单词“as”和公式或方程式来生成值。这种方法不使用附加存储,它会在每次有人执行选择时计算值,因此表配置文件保持更窄,并且您获得更好的性能。唯一的缺点是您不能在计算列上放置索引。 (虽然 SQL 服务器中有一个标志允许您向数据库指定它应该在创建或更新时保持该值......在这种情况下它可以被索引)

      但是,在您的示例中,您正在访问另一个表中多行的数据。为此,您需要其他受访者建议的触发器。

      【讨论】:

      • 在这种情况下,OP想要一个单独表中多个相关记录的垂直总和(如订单金额/订单总额情况)
      • 计算列无法访问其他行或表中的数据。
      • 谢谢,在没有阅读示例详细信息的情况下回答了问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-16
      • 1970-01-01
      相关资源
      最近更新 更多