You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Developer需求:统计图书销量,展示无销量图书并处理空值

解决图书销量统计及全量图书展示问题

看起来你遇到的核心问题是内连接过滤掉了无销量的图书,加上Oracle里不能用ISNULL(那是SQL Server的函数),咱们一步步来解决:

问题根源

你原来的查询用了隐式内连接(逗号分隔表),只有同时存在于BOOKS、ORDERITEMS和ORDERS中的数据才会被返回,这就导致没有订单的3本图书被过滤掉了。另外,Oracle中处理NULL值要用NVL()而不是ISNULL,这也是你之前尝试无效的原因。

修正后的SQL语句

SELECT 
    b.ISBN,
    b.TITLE,
    b.RETAIL,
    b.COST,
    -- 无销量时利润百分比显示0%
    NVL(ROUND(SUM((b.RETAIL - b.COST)/b.COST*100), 2), 0) || '%' AS "Profit Percentage",
    -- 无销量时订单数显示0,用oi.ORDER#而非*,避免把NULL行算成1
    NVL(COUNT(oi.ORDER#), 0) AS "Book Count"
FROM BOOKS b
-- 左连接确保所有图书都被保留,哪怕没有订单
LEFT JOIN ORDERITEMS oi ON b.ISBN = oi.ISBN
LEFT JOIN ORDERS o ON oi.ORDER# = o.ORDER#
-- GROUP BY必须包含所有非聚合字段
GROUP BY b.ISBN, b.TITLE, b.RETAIL, b.COST
ORDER BY b.ISBN;

关键细节说明

  • LEFT JOIN的作用:从BOOKS表取出所有14条记录,匹配对应的订单数据,如果没有匹配到,ORDERITEMS和ORDERS的字段会显示为NULL,这样就不会丢失无销量的图书
  • NVL()处理NULL:Oracle中NVL(字段, 替代值)会把NULL替换成你指定的值,这里把无销量时的利润百分比和订单数都换成0
  • COUNT(oi.ORDER#)而非COUNT(*): 如果你用COUNT(*),左连接产生的NULL行也会被计数为1,不符合“无销量显示0”的需求;而COUNT(oi.ORDER#)会忽略NULL值,无订单时返回0
  • 关于ROLLUP:ROLLUP是用来生成分组汇总数据的(比如按ISBN统计后再加一行总计),不是用来处理空值转0的,所以这里完全不需要用它

这样修改后,你就能看到全部14本图书,无销量的图书对应的利润百分比和订单数都会显示0了。

内容的提问来源于stack exchange,提问作者Atheya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:27:21