请考虑下表:
Company BuildYear ProductName Cost
------ ----------- ----------- ----
Foo 1900 A_1 50
Foo 2000 B_1 50
Foo 2000 B_2 50
Bar 1900 A_1 50
Bar 1900 A_2 100
Bar 2000 B_1 50
查询 #1(简单):
我们正在寻找在1900年只生产一种产品的公司。在上面的例子中,只有公司Foo
A_1产品(公司Bar
生产两种不同类型的产品,即A_1和A_2)
为此,查询将是:
SELECT *
FROM Table
WHERE BuildYear=1900
GROUP BY ProductName
HAVING COUNT(*) = 1
查询#2(我的问题):
现在我们正在寻找在1900年只生产一种产品的公司,而这种产品的成本低于75。对于上面的示例表,答案将再次只是Foo
公司。
不用说,简单地将AND cost<75
添加到上述查询中会返回错误的答案(Foo
和Bar
)。此外,将其添加到HAVING
子句中会引发以下错误消息:
列"成本"必须出现在 GROUP BY 子句中或在聚合函数中使用
另一方面,我宁愿不再次将上述查询的结果与原始表联接(如果可能的话),因为该表实际上很大。
任何反馈将不胜感激。
更新:上面显示的列仅用于演示,在实际表中它们都是TEXT
的(因此 MIN/MAX 技巧不适用)
更新:为什么AND cost<75
添加到WHERE
子句不起作用?由于该条款切断了Bar::A_2
产品,并且之后HAVING
正在评估时,它将Bar
视为拥有一种产品的公司。
如果只有一个产品,则可以使用MIN()
或MAX()
-- 如果组中只有一行,它们具有相同的值:
SELECT *
FROM Table
WHERE BuildYear = 1900
GROUP BY ProductName
HAVING COUNT(*) = 1 AND MIN(COST) < 75;
如果您将数字存储为文本,则应修复数据。
除此之外,只需转换它:
HAVING COUNT(*) = 1 AND MIN(COST::NUMERIC) < 75;