#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