【问题标题】:Use of the HAVING clause when using muliple sums使用多个总和时使用 HAVING 子句
【发布时间】:2011-11-03 17:01:16
【问题描述】:

我在从多个表中获取多个总和时遇到问题。短篇小说,我的答案在本网站的“sql sum data from multiple tables”线程中得到了解决。但它的不足之处在于,现在我只想显示大于一定数量的总和。因此,虽然我的选择中有子选择,但我认为我需要使用 HAVING 子句来过滤太低的总和。

例如,使用上面链接中指定的代码(更具体地说,所有者选择正确的答案),我只想查看 SUM(AP2.Value) > 1500 的查询结果。有什么想法吗?

【问题讨论】:

    标签: sql


    【解决方案1】:

    如果您需要过滤任何聚合函数的结果,您必须使用HAVING 子句。 WHERE 应用于行级别,因为数据库会扫描表以查找匹配的内容。 HAVING 基本上是在结果集发送到客户端之前立即应用的。在 WHERE 运行时,聚合函数结果不(也不能)可用,因此您必须使用 HAVING 子句,该子句在主查询完成并且所有聚合结果都可用后应用。

    所以...长话短说,是的,你需要这样做

    SELECT ...
    FROM ...
    WHERE ...
    HAVING (SUM_AP > 1500)
    

    请注意,您可以在 having 子句中使用列别名。用技术术语来说,having 在上述查询上的工作原理与将初始查询包装在另一个查询中并在包装器上应用另一个 WHERE 子句基本完全相同:

    SELECT *
    FROM (
       SELECT ... 
    ) AS child
    WHERE (SUM_AP > 1500)
    

    【讨论】:

      【解决方案2】:

      您可以将该查询包装为子选择,然后在 WHERE 子句中指定您的条件:

      SELECT
          PROJECT,
          SUM_AP,
          SUM_INV
      FROM (
          SELECT
              AP1.[PROJECT],
              (SELECT SUM(AP2.Value) FROM AP AS AP2 WHERE AP2.PROJECT = AP1.PROJECT) AS SUM_AP,
              (SELECT SUM(INV2.Value) FROM INV AS INV2 WHERE INV2.PROJECT = AP1.PROJECT) AS SUM_INV
          FROM AP AS AP1
          INNER JOIN INV AS INV1 ON
              AP1.[PROJECT] = INV1.[PROJECT]
          WHERE
              AP1.[PROJECT] = 'XXXXX'
          GROUP BY
              AP1.[PROJECT]
      ) SQ
      WHERE
          SQ.SUM_AP > 1500
      

      【讨论】:

        猜你喜欢
        • 2022-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多