使用多个总和时使用HAVING子句

时间:2011-11-03 17:01:16

标签: sql

我遇到了从多个表中获取多个总和的问题。简短的故事,我的答案在本网站的“sql sum data from multiple tables”主题中解决了。但是,如果它变得简短,那么现在我只想显示大于一定金额的金额。因此,虽然我在我的选择中进行了子选择,但我认为我需要使用HAVING子句来过滤总量太低的总和。

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

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

您可以将该查询包装为子选择,然后在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