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