【问题标题】:How to SELECT sum of numbers less than 30 and sum of numbers greater than 30?如何选择小于 30 的数字总和和大于 30 的数字总和?
【发布时间】:2010-11-07 20:57:12
【问题描述】:

我正在尝试编写一个 SELECT 语句来选择字段的总和,但我想返回小于 30 的数字的总和以及大于 30 的数字的总和。我意识到我可以通过加入两个选择来做到这一点在一起,但我希望找到一种“整洁”的方式。

【问题讨论】:

  • 如果总和等于 30,我认为你对任何事情都不感兴趣。
  • 跨行求和?你的意思是真的“ 30”吗?

标签: sql oracle teradata


【解决方案1】:

这些方面的内容(更正您的环境的语法):

SELECT
    sum(case when Field < 30 then Field else 0 end) as LessThan30,
    sum(case when Field > 30 then Field else 0 end) as MoreThan30
FROM
    DaTable

【讨论】:

  • +1 很好。如果您需要它的性能,我怀疑任何东西都可以击败两个选择结合在一起。
  • 假设您在列上有一个索引。
  • 我认为这个查询没有性能问题。或者换一种说法:没有理由为什么两个单独的选择会更快。如果您在 Field 上有一个索引(并且 Field 不为空),则只需访问该索引即可解决此查询。
  • 我怀疑 Oracle 并没有去检查聚合函数是否会返回相同的结果,无论是否包含带有 NULL 的行;除非您添加 WHERE Field IS NOT NULL,否则它更有可能强制执行 FTS,这是我在这里推荐的。
  • 您可以添加 where 子句:where Field is not null and Field != 30 如果大多数记录的 Field 为 30 并且 Field 上有索引,则可能会有所帮助。
【解决方案2】:

这个要求很模糊,但我假设 SUM 跨行和 30。这与案例答案不同。

SELECT
    SelectCol1, SelectCol2, SelectCol3, ..., SUM(AggregateCol)
FROM
    Table
GROUP BY
    SelectCol1, SelectCol2, SelectCol3, ...
HAVING
    SUM(AggregateCol) <> 30

【讨论】:

    【解决方案3】:

    如果我理解正确,您有一个包含数值的列,并且您想为字段值小于 30 的所有 thw 行查找该字段的总和,并且与字段值的变化大于 30 的条件相同. 如果这是正确的,那么您可以使用下面的查询并相应地复制表和列名。

    SELECT  SUM(CASE        WHEN col1 < 30 THEN COL1        ELSE 0 END
           )    SUM(CASE        WHEN col1 < 30 THEN COL1        ELSE 0 END
           ) FROM   DATABASE.SCHEMANAME.TABLE
    

    谢谢, 阿图尔

    【讨论】:

      猜你喜欢
      • 2013-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-17
      • 1970-01-01
      • 2012-07-26
      • 1970-01-01
      • 2015-07-03
      相关资源
      最近更新 更多