ORACLE find count на основе двух столбцов

#sql #database #oracle

#sql #База данных #Oracle

Вопрос:

У меня есть таблица базы данных Oracle, где

У меня много столбцов в этой конкретной таблице, но я хочу получить результат на основе вычислений между двумя столбцами, как описано ниже

 Project|Status
-------|--------
 1     | Done    
 1     | Pending
 2     | Done
  

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

Я пробовал этот запрос, но он возвращает строки, которые имеют статус как ожидающие, так и выполненные,

 SELECT * FROM MYTABLE T 
WHERE EXISTS
(SELECT 1 FROM MYTABLE WHERE Project = A.Project AND ROWID < A.ROWID AND            
Status ='Done') 
AND T.Status!='Done' AND T.Status='Pending'
  

@Обновить
У меня также есть другие значения статуса в этом столбце, такие как «Частично выполнено» и «Запрошено», и поэтому я хочу получать только те проекты, которые имеют только статус ожидания и не имеют статуса «Выполнено» во всей таблице.

Ответ №1:

Если вы хотите получить ожидающие проекты, у которых нет другого статуса «Выполнено», используйте приведенный ниже запрос.

 SELECT * FROM MYTABLE T 
WHERE T.Status='Pending'
AND NOT EXISTS --excluding projects with 'done' status
(SELECT 1 FROM MYTABLE A WHERE A.Project = T.Project AND         
A.Status ='Done') 
  

Если вы хотите получить общее количество незавершенных проектов, используйте приведенный ниже скрипт.

  SELECT COUNT(*) FROM MYTABLE T 
 WHERE T.Status='Pending'
    AND NOT EXISTS
    (SELECT 1 FROM MYTABLE A WHERE A.Project = T.Project AND         
    A.Status ='Done') 
  

Комментарии:

1. Это то, что я искал. Спасибо

2. Проверьте псевдонимы.

Ответ №2:

Вы можете сделать это с помощью HAVING и GROUP BY :

 SELECT
    Project
FROM MyTable t
GROUP BY Project
HAVING
    -- Should have at least one Pending status
    SUM(CASE WHEN Status = 'Pending' THEN 1 ELSE 0 END) > 0 
    -- No other status aside from Pending
    AND SUM(CASE WHEN Status <> 'Pending' THEN 1 ELSE 0 END) = 0
  

Ответ №3:

Одного способа НЕ СУЩЕСТВУЕТ

 SELECT * FROM MYTABLE T 
WHERE NOT EXISTS
   (SELECT 1 
    FROM MYTABLE T2 
    WHERE T2.Project = T.Project AND T.ROWID < T2.ROWID 
         AND T2.Status ='Done') 
AND Status='Pending'
  

Не уверен AND T.ROWID < T2.ROWID . Я бы лучше использовал столбец datetime, указывающий дату, когда статус стал актуальным. Также в зависимости от вашей задачи это может быть отменено AND T.ROWID > T2.ROWID .

Ответ №4:

Попробуйте этот скрипт: он будет считать проект, статус которого равен только Pending

 SELECT Project,COUNT(Project) 
FROM MYTABLE t1 
WHERE NOT EXISTS(SELECT 1 FROM MYTABLE t2 WHERE t2.Project = t1.Project AND T2.Status='Done') 
AND t1.Status='Pending' 
GROUP BY Project