Моя таблица может иметь разные типы вывода, как показано ниже:
hostname orderId status Heading Detail
abc.com 3 30 HeadingA Details1
abc.com 5 40 HeadingB Details2
... more rows
hostname orderId status Heading Detail
cde.com 3 40 HeadingA Details1
cde.com 5 30 HeadingB Details2
... more rows
hostname orderId status Heading Detail
efg.com 3 50 HeadingA Details1
efg.com 5 30 HeadingB Details2
... more rows
Я хочу выполнить вычисление status
первой возвращенной строки, как показано ниже:
1) If `status is 30` then show status as `Finished`. Also `Heading` and `Detail` should be empty.
2) If `status is 40` or `status is 50` then show status as `Error`. `Heading` and `Detail` should show as such.
Желательно вывод выглядит следующим образом:
hostname orderId status Heading Detail
abc.com 3 Finished
hostname orderId status Heading Detail
cde.com 3 Error HeadingA Details1
hostname orderId status Heading Detail
efg.com 3 Error HeadingA Details1
Я написал следующий запрос, чтобы получить желаемый результат:
SELECT host.hostname,orderId,
CASE WHEN status = 30 THEN 'Finished' ELSE 'Error' END 'status',
CASE WHEN status = 40 THEN '' ELSE Heading END 'Heading',
CASE WHEN status = 40 THEN '' ELSE Detail END 'Detail'
FROM
(
SELECT host.hostname,
cb.orderId,
cb.status,
cb.chefbook_name AS Heading,
(
SELECT log_message
FROM chefbookrun rr
WHERE rr.chefbook_id = c.id
ORDER BY id DESC
LIMIT 1
) AS Detail
FROM host
INNER JOIN host_infl hif ON host.vc_server_id = hif.vc_server_id
INNER JOIN chefcookbook cb ON hif.id = cb.host_id
WHERE host.hostname REGEXP 'abc'
ORDER BY cb.orderId
) AS temp
GROUP BY hostname;
Но он дает ошибку:
Unknown column 'host.hostname' in 'field list'
Пожалуйста, дайте мне знать, нужно ли мне использовать aggregate Group By
в моем запросе, потому что если я удалю запрос, он не будет ошибочным.
SELECT temp.hostname,
orderId,
CASE WHEN status = 30 THEN 'Finished' ELSE 'Error' END 'status',
CASE WHEN status = 30 THEN '' ELSE Heading END 'Heading',
CASE WHEN status = 30 THEN '' ELSE Detail END 'Detail'
FROM(SELECT host.hostname,
cb.orderId,
cb.status,
cb.chefbook_name AS Heading,
(SELECT log_message
FROM chefbookrun rr
WHERE rr.chefbook_id = c.id
ORDER BY id DESC
LIMIT 1 ) AS Detail
FROM host
INNER JOIN host_infl hif ON host.vc_server_id = hif.vc_server_id
INNER JOIN chefcookbook cb ON hif.id = cb.host_id
WHERE host.hostname REGEXP 'abc'
ORDER BY cb.orderId
) AS temp;