SQLite - 如何使用 WHERE 条件执行 COUNT()?
SQLite - How to perform COUNT() with a WHERE condition?
我有一个 products
table,其中包含以下字段:_id
、product_name
、priority
和 shelf_id
。
我有一个 shelves
table,其中包含以下字段:_id
和 shelf_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))
我有一个 products
table,其中包含以下字段:_id
、product_name
、priority
和 shelf_id
。
我有一个 shelves
table,其中包含以下字段:_id
和 shelf_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))