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

问题描述 投票:0回答:4

我有一个

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
数据。

sql sqlite subquery
4个回答
19
投票
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


6
投票

在 SQLite v3.32.0 及以上中,您可以使用

IIF()
函数仅统计优先级大于
0
的产品:

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

另一种使用

COUNT()
的替代方法:

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

3
投票

由于其他人已经展示了如何使用 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
。希望有帮助。


2
投票

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

SUM(CASE WHEN products.priority > 0 THEN 1 ELSE 0 END) AS num_products_in_shelf_with_priority
© www.soinside.com 2019 - 2024. All rights reserved.