如果没有记录计数,则显示零-ORACLE SQL查询

如果没有记录计数,则显示零-ORACLE SQL查询,sql,oracle,plsql,Sql,Oracle,Plsql,下面的Oracle查询给出了错误消息和序列号是否存在任何不同的错误 如果有零或没有不同的错误计数,而不是显示空白/空结果。我怎样才能看到这样的输出?我尝试使用NVLerror_消息0和COALESCE Sumtotal 0,但没有得到所需的输出 预期产出: Oracle SQL查询: 选择 1作为索引_Num, CONCAT“不同错误:”,错误消息| |‘| | |序列号|, 苏姆道尔 从…起 选择错误消息、序列号、计数*总数 来自表1 其中错误消息与“%INVALID%”不同 分组错误消息,序

下面的Oracle查询给出了错误消息和序列号是否存在任何不同的错误

如果有零或没有不同的错误计数,而不是显示空白/空结果。我怎样才能看到这样的输出?我尝试使用NVLerror_消息0和COALESCE Sumtotal 0,但没有得到所需的输出

预期产出:

Oracle SQL查询:

选择 1作为索引_Num, CONCAT“不同错误:”,错误消息| |‘| | |序列号|, 苏姆道尔 从…起 选择错误消息、序列号、计数*总数 来自表1 其中错误消息与“%INVALID%”不同 分组错误消息,序列号 分组错误消息,序列号 为子查询创建CTE,并使用UNION ALL with NOT EXISTS覆盖CTE不返回任何行的情况:

WITH cte AS (
  SELECT error_message, serial_num, COUNT(*) total 
  FROM Table1 
  WHERE error_message NOT LIKE '%INVALID%' 
  GROUP BY error_message, serial_num
)
SELECT 
  1 as Index_Num, 
  CONCAT(
    'Different Errors:  ', 
    list_agg(error_message || '# ' || serial_num) within group (order by error_message)
  ), 
  SUM(total) 
FROM cte
UNION ALL
SELECT 1, 'Different Errors:  ', 0
FROM dual
WHERE NOT EXISTS (SELECT 1 FROM cte)

这并不完全是你想要的,但可能会被证明是有用的。您可以使用分组集轻松添加错误总数为的行:


唉,即使有错误,也会生成摘要行。我想你可能会觉得这很有用。

D'oh!看来我花的时间太长了。这是子孙后代的另一个选择:

选择 1. 海螺 '不同的错误:', 案例 当src.error\u消息为空时 ELSE src.error|u message | | | | | src.serial_num 终止 总结 合并src.total,0为总计 FROM dual-在错误表中并没有行的情况下获取种子行 左连接 选择错误消息、序列号、计数*总数 来自表1 其中错误消息与“%INVALID%”不同 分组错误消息,序列号 0=0时的src
您是在检查NULL值还是错误消息实际上包含NULL文本?要检查您使用的空值是否为空。在何处更新条款您看到了什么输出?您的内部查询将按序列号提供不同错误消息的计数。由于您的外部查询正在使用相同的列执行GROUP BY,因此除了使用CONCAT.Yes创建新列之外,它实际上没有做任何其他事情。通常,如果存在适当的错误,则计数显示为1。不同错误:不匹配的序列343543532 1出现一些错误错误:ORA-00937:没有单个组函数我假设您的代码适用于子查询返回行的情况,并且您只需要在它不返回任何行的情况下获得帮助。还是不?对。通常,如果存在适当的错误,则结果为1。不同错误:不匹配的序列343543532 1出现了一些错误。这里的错误消息是不匹配序列发生的一些错误,序列号是343543532,最后一个值1是总和/计数。因此,如果代码正常工作,将UNION ALL添加到其中也应该正常工作。我改为list_agg,以防子查询返回超过1行。似乎SUMtotal必须改为NVLSUMtotal,0或COALESCE SUMtotal,0。否则,总和将显示不带0的空白值。非常感谢@ravioli,我发现您的代码对我的工作很有用。投票结果:很高兴它有帮助:
WITH cte AS (
  SELECT error_message, serial_num, COUNT(*) total 
  FROM Table1 
  WHERE error_message NOT LIKE '%INVALID%' 
  GROUP BY error_message, serial_num
)
SELECT 
  1 as Index_Num, 
  CONCAT(
    'Different Errors:  ', 
    list_agg(error_message || '# ' || serial_num) within group (order by error_message)
  ), 
  SUM(total) 
FROM cte
UNION ALL
SELECT 1, 'Different Errors:  ', 0
FROM dual
WHERE NOT EXISTS (SELECT 1 FROM cte)
SELECT 1 as Index_Num, 
       ('Different Errors:  ' || error_message || '# ' || serial_num), 
       COUNT(*) as total 
FROM Table1 
WHERE error_message NOT LIKE '%INVALID%' 
GROUP BY GROUPING SETS ( (error_message, serial_num), () );