Показывать ноль, если счетчика нет - SQL-запрос ORACLE - PullRequest
1 голос
/ 06 октября 2019

В приведенном ниже запросе Oracle выдается сообщение об ошибках с error_message и Serial_num.

Если счетчик НУЛЬ или НЕТ Different error вместо отображения пустого / нулевого результата. Как я могу увидеть результат, как это? Я попытался с NVL(error_message,0) и COALESCE (Sum(total),0), но не получил желаемый результат.

Ожидаемый результат :

1   Different Errors:       0

Oracle SQL Query:

SELECT 
  1 as Index_Num, 
  CONCAT('Different Errors:  ', error_message || '# ' || serial_num), 
  SUM(total) 
FROM ( 
  SELECT error_message, serial_num, COUNT(*) total 
  FROM Table1 
  WHERE error_message NOT LIKE '%INVALID%' 
  GROUP BY error_message, serial_num
) 
GROUP BY error_message, serial_num

Ответы [ 3 ]

1 голос
/ 06 октября 2019

Создайте CTE для подзапроса и используйте UNION ALL с 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)
0 голосов
/ 06 октября 2019

D'Oh! Похоже, я слишком долго. Вот еще один вариант для потомков:

SELECT 
  1, 
  CONCAT(
    'Different Errors:  ', 
    CASE 
      WHEN src.error_message IS NULL THEN '' 
      ELSE src.error_message || ' # ' || src.serial_num 
    END
  ) Summary,
  COALESCE(src.total, 0) AS total
FROM dual -- Get a seed row (in case there are no rows in error table)
LEFT JOIN (
  SELECT error_message, serial_num, COUNT(*) total 
  FROM Table1 
  WHERE error_message NOT LIKE '%INVALID%' 
  GROUP BY error_message, serial_num
) src ON 0=0

SQL Fiddle

0 голосов
/ 06 октября 2019

Это не совсем то, что вы просите, но может оказаться полезным. Вы можете легко добавить строку с общим количеством ошибок, используя grouping sets:

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), () );

Увы, это создает итоговую строку даже при наличии ошибок. Мне приходит в голову, что вы можете найти это полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...