Вычисление счетчиков в SQL-запросе и сравнение их в одном запросе

sudeep спросил: 12 мая 2018 в 03:52 в: sql

Я хотел бы получить количество строк с определенными критериями, а затем сравнить числа в одном запросе. Как я могу это сделать?

Мне нужно получить список устройств, для которых начальный столбец в порядке, а проверенный столбец не выполнен. Я не уверен, как выполнить цикл через всю таблицу, чтобы выполнить эти вычисления.

SELECT type,device,
 (SELECT (COUNT(*) WHERE Started = "OK" from table1) AS t1, 
 (SELECT (COUNT(*) WHERE tested = "FAILED" from table1) AS t1
 from table1
      where remediated = "Remediated"
      GROUP BY type,device
      HAVING (SELECT (COUNT(*) WHERE Started = "OK" from table1) = (SELECT (COUNT(*) WHERE tested = "FAILED" from table1)

1 ответ

Gordon Linoff ответил: 12 мая 2018 в 03:54

Использовать условную агрегацию:

SELECT type, device,
       SUM(CASE WHEN Started = 'OK' THEN 1 ELSE 0 END) as num_ok,
       SUM(CASE WHEN Started = 'FAILED' THEN 1 ELSE 0 END) as num_failed
FROM table1
WHERE remediated = 'REMEDIATED'
GROUP BY type, device
HAVING num_ok = num_failed;

Это не делает то, что делает ваш запрос, потому что он фильтрует на remediated для подсчетов, а также строк. Однако я подозреваю, что это то, что вы intend .

Примечание. Не все базы данных поддерживают псевдонимы таблиц в HAVING. Вы можете просто повторить выражения, если это необходимо:

HAVING SUM(CASE WHEN Started = 'OK' THEN 1 ELSE 0 END) = SUM(CASE WHEN Started = 'FAILED' THEN 1 ELSE 0 END);
sudeep ответил: 12 мая 2018 в 06:08
Спасибо, кучка Гордона. Ваша помощь искренне ценится!