Запросите те же самые таблицы - PullRequest
0 голосов
/ 26 марта 2020

Все,

У меня есть следующий запрос, который я пытался выяснить, как заставить работать большую часть дня. Он не возвращает никаких записей, когда я запускаю его.

SELECT DISTINCT op.OperationID
FROM ProductionOperations op
LEFT JOIN ProductionOperations op1 ON (op.OperationID = op1.OperationID)
WHERE op1.ID Is Null;

Я знаю, что это неправильно, и SQL не в моей рубке, и мне нужен кто-то, кто умнее меня, чтобы помочь. У меня есть таблица, ProductionOperations, которая имеет столбец OperationID и столбец OperationComplete {0,1}. Таблица может иметь несколько записей с одним и тем же номером идентификатора операции, если операция не может завершиться (0), чтобы завершить операцию. Для завершения операции может потребоваться 3 или 4 попытки. Иногда это может не завершить все вместе. В конце я хочу получить количество отдельных неудачных операций, а не количество каждой неудачной операции (0).

Вот как может выглядеть таблица: pi c таблицы

Мне нужно посчитать количество выполненных операций, которое будет равно 4 в предыдущей таблице, и количество незавершенных операций, которое будет 2. Любая помощь будет оценена. Обратите внимание, что таблица является лишь примером, а не реальной таблицей, с которой я работаю. Не могу поделиться из-за IP.

Спасибо

Ответы [ 2 ]

0 голосов
/ 26 марта 2020

Вы можете использовать 2 уровня агрегации:

select 
  iif(t.MaxOperationComplete = 1, 'Completed', 'Failed') as OperationStatus,
  count(*) as counter
from (  
  select OperationID, max(OperationComplete) as MaxOperationComplete
  from ProductionOperations 
  group by OperationID
) as t  
group by t.MaxOperationComplete

Результаты:

OperationStatus counter
Failed          2
Completed       4

Или, если вы хотите, чтобы результаты в 1 строке:

select 
  -sum(t.MaxOperationComplete = 0) as Failed,  
  -sum(t.MaxOperationComplete = 1) as Completed
from (  
  select OperationID, max(OperationComplete) as MaxOperationComplete
  from ProductionOperations 
  group by OperationID
) as t 

Результаты:

Failed  Completed
2       4
0 голосов
/ 26 марта 2020

Вы можете использовать два уровня агрегации. Сначала получите максимум operationcompleted для каждой операции. Это будет 1 для завершенных операций и 0 для незавершенных операций. Затем используйте условное агрегирование для подсчета 1 s и 0 s для получения значений.

SELECT count(CASE
               WHEN operationcomplete = 1 THEN
                 1
             END) completed_operations,
       count(CASE
               WHEN operationcomplete = 0 THEN
                 1
             END) not_completed_operations
       FROM (SELECT operationid,
                    max(operationcomplete) operationcomplete
                    FROM elbat
                    GROUP BY operationid) x;
...