请考虑下表:
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年仅生产一种产品的公司。在上面的示例中,只有拥有A_1产品的公司Foo
(公司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
视为拥有一个产品的公司。
答案 0 :(得分:1)
如果只有一种产品,则可以使用@Injectable({
providedIn: 'root'
})
或MIN()
-如果组中只有一行,则它们具有相同的值:
MAX()
如果您将数字存储为文本,则应该修正数据。
除此以外,只需将其转换即可:
SELECT *
FROM Table
WHERE BuildYear = 1900
GROUP BY ProductName
HAVING COUNT(*) = 1 AND MIN(COST) < 75;