如何在SQL查询中显示包含值为0的所有结果
解决SQL分组查询中缺失值显示为0的问题
原执行的SQL语句:
Select books AS books_read, Count(*) as page_count FROM books_rollup WHERE books IN ('Value 1', 'Value 2', 'Value 3') Group By books
查询结果仅返回Value 1和Value 3的统计数据,Value 2因在books_rollup表中无匹配数据,对应的page_count为0却未被展示。要让所有指定值都出现在结果中,可通过以下方式修改查询:
通用解决方案(适配多数数据库)
SELECT t.books AS Books_Read, COUNT(b.books) AS Page_Count FROM (SELECT 'Value 1' AS books UNION ALL SELECT 'Value 2' AS books UNION ALL SELECT 'Value 3' AS books) t LEFT JOIN books_rollup b ON t.books = b.books GROUP BY t.books
简化写法(支持VALUES子句的数据库:MySQL 8.0+、PostgreSQL、SQL Server等)
SELECT t.books AS Books_Read, COUNT(b.books) AS Page_Count FROM (VALUES ('Value 1'), ('Value 2'), ('Value 3')) AS t(books) LEFT JOIN books_rollup b ON t.books = b.books GROUP BY t.books
关键逻辑说明
- 先构造包含所有目标书籍值的临时数据集
t,确保需要展示的每个值都有一条基础记录 - 使用**左连接(LEFT JOIN)**关联原表
books_rollup:左连接会保留临时表的所有记录,即使原表中没有对应匹配的数据 - 用
COUNT(b.books)替代原查询的COUNT(*):当原表无匹配数据时,b.books会返回NULL,COUNT函数会忽略NULL值,最终统计结果为0;若使用COUNT(*),会把左连接生成的NULL行统计为1,无法得到预期的0值
内容的提问来源于stack exchange,提问作者Knowledge
相关产品推荐
相关产品推荐

