我有一个
products
表,其中包含以下字段:_id
、product_name
、priority
和 shelf_id
。
我有一个
shelves
表,其中包含以下字段:_id
和 shelf_name
。
目前,我有这个 SQL,它返回一个结果集,显示每个货架的名称以及每个货架内的产品数量:
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子查询并找到了这个教程,但它似乎不是我想要的。
有人可以帮我推动正确的方向,或者更好的是,修改我的 SQL 查询,使其返回有效的
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
它。此外,还包括 shelf_name
子句中的 group by
。
在 SQLite v3.32.0 及以上中,您可以使用
IIF()
函数仅统计优先级大于 0
的产品:
SUM(IIF(products.priority > 0, 1, 0))
另一种使用
COUNT()
的替代方法:
COUNT(IIF(products.priority > 0, 1, NULL))
由于其他人已经展示了如何使用 SUM 来执行此操作,因此我将使用 COUNT 来展示它。我猜产品表与货架表是分开的,这意味着您需要某种连接或其他东西。
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
。希望有帮助。
您可以为此使用总和和条件:
SUM(CASE WHEN products.priority > 0 THEN 1 ELSE 0 END) AS num_products_in_shelf_with_priority