如何使用NVL Oracle SQL显示空值?

lsmepo6l  于 2022-10-04  发布在  Oracle
关注(0)|答案(2)|浏览(239)

我想挑选一份客户名单,列出他们的总购买量。

PURCHY_AMOUNT的总和不能包括‘VOID’和‘FAILED’状态金额

目前,我有如下所示的SQL脚本,但没有显示状态为“失败”和“无效”的客户。

我哪里做错了?

脚本:

  1. SELECT C.CUSTOMER_ID, C.NAME, NVL(SUM(AMOUNT), 0) AS PURCHASE_AMOUNT
  2. FROM CUSTOMER C
  3. LEFT JOIN TRANSACTION T ON T.CUSTOMER_ID = C.CUSTOMER_ID
  4. WHERE T.STATUS NOT IN('Void', 'Failed')
  5. GROUP BY C.CUSTOMER_ID, C.NAME;

实际结果:

预期结果:

gudnpqoy

gudnpqoy1#

WHERE子句中条件T.STATUS NOT IN('Void', 'Failed')的存在有效地将事务表的左联接转换为内联接,因为如果WHERE子句中的条件不满足,则不能接受任何行。要将T.STATUS...条件视为左连接的一部分,它必须出现在连接本身的ON子句中:

  1. SELECT C.CUSTOMER_ID, C.NAME, NVL(SUM(AMOUNT), 0) AS PURCHASE_AMOUNT
  2. FROM CUSTOMER C
  3. LEFT JOIN TRANSACTION T
  4. ON T.CUSTOMER_ID = C.CUSTOMER_ID AND
  5. T.STATUS NOT IN('Void', 'Failed')
  6. GROUP BY C.CUSTOMER_ID, C.NAME;
voase2hg

voase2hg2#

您可以在SELECT PART中用CASE检查‘T.STATUS’,而不是在WHERE子句中检查它。

  1. SELECT
  2. c.customer_id,
  3. c.name,
  4. SUM(
  5. CASE
  6. WHEN t.status NOT IN('Void', 'Failed') THEN
  7. amount
  8. ELSE
  9. 0
  10. END
  11. ) AS purchase_amount
  12. FROM
  13. customer c
  14. LEFT JOIN transaction t ON t.customer_id = c.customer_id
  15. GROUP BY
  16. c.customer_id,
  17. c.name;
展开查看全部

相关问题