确定样本是否包含多个 ID 的 0 行

Determining if a sample contains 0 rows for multiple ID's

所以我创建了一个简单的查询,它将传递所有 OrdID 的订单有 2 个或更多苹果:

SELECT ordid 
FROM results 
WHERE ordid IN (12,24,53,21,41,51) 
AND product = 'apples' 
GROUP BY ordid 
HAVING COUNT(ordid) > 1

如何为包含 0 个苹果的 OrdID 执行此操作?(这不起作用,因为苹果 OrdID 上没有产品,因此它传递 0 行。 ) 我希望它列出所有 OrdID 的 Apples < 1 产品。

SELECT ordid 
FROM results 
WHERE ordid IN (12,24,53,21,41,51)
AND product = 'apples' 
GROUP BY ordid 
HAVING COUNT(ordid) < 1

我无法在我的机器上重现,但我希望这个查询应该有效:

SELECT ordid 
FROM results 
WHERE ordid in (12,24,53,21,41,51) 
GROUP BY ordid 
HAVING SUM(CASE WHEN product = 'apples' THEN 1 ELSE 0 END) < 1

我用产品的 COUNT() 而不是 orderid 切换了 HAVING,因为您要计算产品的数量。

SELECT ordid
FROM results 
WHERE ordid in (12,24,53,21,41,51) and product = 'apples'
GROUP BY ordid 
HAVING COUNT(product) = 0

使用 EXISTS() 函数获取所有 OrdID,其中不存在与 product = 'apples'

相关的行

您 运行 遇到的问题是您要从 table 中选择(即限制为那些行),您想要匹配的是 table(即排除那些行)。这些是相反的。

相反,将其翻转过来,以便从值集中进行选择,然后排除匹配的值:

SELECT ordid FROM (VALUES (12),(24),(53),(21),(41),(51)) AS ordids(ordid)
WHERE NOT EXISTS (
    SELECT * FROM results
    WHERE results.ordid = ordids.ordid
    AND results.product = 'apples'
)

这将 return 一个 ordid 的结果,即使该值根本没有出现在 results table 中。