查询中的减法(SUM)

时间:2011-07-15 02:44:06

标签: mysql sql aggregate-functions

我有这个查询有这个输出(正确):

15
44

查询:

  SELECT T.numContribuinte, 
         T.numero, 
         SUM(C.valor - T.valorTotalChamadas) AS saldo
    FROM telemovel T
    JOIN CARREGAMENTO C ON C.numero = T.numero
GROUP BY T.numContribuinte, T.numero
  HAVING saldo > 0
ORDER BY T.numero DESC

如果我删除单词sum,则输出将为:

15
15

我的问题是

为什么缺少总和会在输出中产生这种差异?

2 个答案:

答案 0 :(得分:2)

差异的原因是by design, MySQL allows columns in the SELECT to not be stated in the GROUP BY or aggregate functions (MAX, MIN, COUNT, etc)。对此功能的警告是返回的值是任意的 - 它们不能保证每次都是一致的。

支持符合ANSI规定的内容,但很少(仅根据我的知识,SQLite)支持此行为。其他人要求列在GROUP BY中提及或包含在聚合函数中。

答案 1 :(得分:0)

当您GROUP BY某些列时,您要求MySQL在这些列中获取具有相同值的所有行,并将这些行替换为结果集中只有一行。 MySQL需要知道您希望每列中的哪一行在返回的一行中的每一列的值。您必须使用聚合函数来描述该函数,例如MIN选择最小值,MAX选择最大值,或SUM选择要替换的所有值的总和。

如果您未能指定聚合函数,MySQL将从其想要的任何行中获取值。当您多次运行同一个查询时,从哪个行取值可能会有所不同 - 未定义行为。