我遇到了从多个表中获取多个总和的问题。简短的故事,我的答案在本网站的“sql sum data from multiple tables”主题中解决了。但是,如果它变得简短,那么现在我只想显示大于一定金额的金额。因此,虽然我在我的选择中进行了子选择,但我认为我需要使用HAVING子句来过滤总量太低的总和。
示例,使用上面链接中指定的代码(更具体地说是所有者选择的答案是正确的),我只想查看SUM(AP2.Value)>的查询结果。 1500.有什么想法吗?
答案 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