SQLite - 如何使用 WHERE 条件执行 COUNT()?

SQLite - How to perform COUNT() with a WHERE condition?

我有一个 products table,其中包含以下字段:_idproduct_namepriorityshelf_id

我有一个 shelves table,其中包含以下字段:_idshelf_name

目前,我有这个 SQL,其中 return 是一个结果集,显示每个货架的名称以及每个货架内的产品数量:

SELECT
    shelves._id AS _id,
    shelves.shelf_name AS shelf_name,
    COUNT(products._id) AS total_num_products_in_shelf
    
FROM
    shelves

INNER JOIN
    products ON shelves._id = products.shelf_id
    
GROUP BY
    shelves._id
    
HAVING
    COUNT(products._id) > 0
    
ORDER BY
    shelf_name ASC

我想要实现的是在结果集中创建一个附加列,该列将显示每个货架中 priority 值大于零的产品数量。类似于...

SELECT
    shelves._id AS _id,
    shelves.shelf_name AS shelf_name,
    COUNT(products._id) AS total_num_products_in_shelf,
    COUNT(products._id WHERE products.priority > 0) AS num_products_in_shelf_with_priority
...

...但当然有效。

我搜索了 sqlite 子查询 并找到了 this tutorial,但它似乎不是我想要的。

有人可以帮助我朝正确的方向推进,或者更好的是,修改我的 SQL 查询,使其 return 有效 num_products_in_shelf_with_priority 数据。

SELECT
shelves._id AS _id,
shelves.shelf_name AS shelf_name,
COUNT(products._id) AS total_num_products_in_shelf,
sum(case when products.priority > 0 Then 1 else 0 end) 
as num_products_in_shelf_with_priority
FROM shelves INNER JOIN products
ON shelves._id = products.shelf_id
GROUP BY shelves._id, shelves.shelf_name
HAVING COUNT(products._id) > 0
ORDER BY shelf_name ASC

您可以包含一个 case 条件,然后 sum 它。此外,group by 子句中还包含 shelf_name

您可以为此使用总和和条件:

SUM(CASE WHEN products.priority > 0 THEN 1 ELSE 0 END) AS num_products_in_shelf_with_priority

由于其他人已经展示了如何使用 SUM 来执行此操作,我将使用 COUNT 来展示它。我猜产品 table 与货架 table 是分开的,这意味着您需要某种连接或其他东西。

SELECT shelves._id AS _id
      ,shelves.shelf_name AS shelf_name
      ,(SELECT COUNT(products._id) FROM products b WHERE a._id = b.shelf_id) total_num_products_in_shelf
      ,(SELECT COUNT(products._id) FROM products b WHERE a._id = b.shelf_id AND b.priority > 0) AS num_products_in_shelf_with_priority
FROM shelves a
ORDER BY a.shelf_name ASC

如果每个产品 ID 或其他内容有多行,请将 COUNT 更改为 COUNT(DISTINCT。如果每个货架有多行,则将 SELECT 更改为 SELECT DISTINCT。希望对您有所帮助。

在 SQLite v3.32.0 and above, you can use IIF() 函数中只计算优先级大于 0 的产品:

SUM(IIF(products.priority > 0, 1, 0))

另一个使用COUNT()的替代方案:

COUNT(IIF(products.priority > 0, 1, NULL))