【问题标题】:SQL for summing only new values仅对新值求和的 SQL
【发布时间】:2011-03-15 04:31:50
【问题描述】:

我有一张这样的桌子

NAME    VALUE
-----------------
bla      1
bla      2
bla      2
bla      3
bla      1
bla      4
bla      2

我怎样才能只对不同的值求和,而忽略重复的值(可能吗?)? 像这样的:

 SELECT SUM(??condition?? value) as total FROM table

总和应该是 10。

谢谢!

【问题讨论】:

  • "只有不同的值" 选择标准是什么?
  • name列的值总是一样的吗?当你有不同的名字时,你想发生什么?

标签: sql conditional sum


【解决方案1】:

这应该可行:

SELECT SUM(value) as total FROM (SELECT DISTINCT value FROM table) tmp;

来源:http://forums.mysql.com/read.php?97,203188,203787#msg-203787

SELECT SUM(DISTINCT value) as total FROM table

来源:http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html#function_sum

第二种解决方案更好,因为它不创建临时表。因此速度更快。

【讨论】:

  • 您发布的两种解决方案通常并不等效,因此说一种比另一种更快并不是在它们之间进行选择的好理由。当名称不是常量字段时,它们会给出不同的结果。
  • 您可以将第一个子查询缩短为“SELECT DISTINCT value FROM table”,对吧?
【解决方案2】:

不会

SELECT SUM(DISTINCT value) FROM mytable;

做这个伎俩?

【讨论】:

  • 你的不错,但 MartyIX 是第一个发帖的 :) 所以我给了他支票 :)
  • +1 来自我,因为您是第一个给出正确答案的人(另一个答案是在 5 分钟限制内编辑的,但这是在您发布您的回答所以你是第一个)。
【解决方案3】:

如果你想对所有不同的值求和,那么你可以使用 DISTINCT:

SELECT SUM(DISTINCT value) AS total FROM yourtable

如果您想为每个名称计算不同的总和,请添加 GROUP BY:

SELECT name, SUM(DISTINCT value) AS total 
FROM yourtable
GROUP BY name

或者只考虑一个特定的名称:

SELECT SUM(DISTINCT value) AS total 
FROM yourtable
WHERE name = 'bla'

【讨论】:

    猜你喜欢
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 2021-05-22
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多