Как использовать условный оператор в сочетании с group_concat? - PullRequest
0 голосов
/ 16 апреля 2020

Я написал следующий запрос, который использует group_concat:

SELECT p.hostname AS Hostname,
GROUP_CONCAT(t2.status SEPARATOR ' :: ') AS Status,
GROUP_CONCAT(t3.error SEPARATOR ' :: ') AS Title
FROM table p
...
...
WHERE p.hostname regexp 'abc'           
GROUP BY p.hostname;    

Я получаю следующий вывод:

Hostname    Status                  Title
abc.com     PASS :: PASS :: PASS    Title1 :: Title12 :: Title3   

Я хочу добавить условное утверждение, так что если оно is all PASS :: PASS :: PASS, тогда в статусе должно отображаться только одно значение как PASS Если оно имеет одно или несколько значений FAIL, таких как PASS :: PASS :: FAIL, тогда в статусе должно отображаться только одно значение как FAIL. Кроме того, он должен показывать только title, соответствующий FAIL. Например, если это PASS :: PASS :: FAIL, тогда выходной сигнал должен быть

Hostname    Status  Title
abc.com     FAIL    title3 

В случае нескольких FAIL, таких как PASS :: FAIL :: FAIL, общее состояние должно быть FAIL. Заголовок должен иметь значение Title2 :: Title3

Hostname    Status      Title
abc.com     FAIL        Title12 :: Title3   

Если все значения для статуса PASS, тогда title должно иметь значение NA

Hostname    Status  Title
abc.com     PASS    NA

1 Ответ

2 голосов
/ 16 апреля 2020

Вы можете сделать это с CASE выражениями для ваших условий:

SELECT p.hostname AS Hostname,
  CASE COUNT(DISTINCT t2.status) 
    WHEN 1 THEN MAX(t2.status)
    ELSE 'FAIL'
  END AS Status,
  CASE  
    WHEN COUNT(DISTINCT t2.status) = 1 AND MAX(t2.status) = 'PASS' THEN 'NA'
    ELSE GROUP_CONCAT(CASE WHEN t2.status = 'FAIL' THEN t3.error END SEPARATOR ' :: ')
  END AS Title
FROM table p
............ 
WHERE p.hostname regexp 'abc'           
GROUP BY p.hostname;

См. Упрощенную демонстрацию .

...