Я знал, что stackoverflow поможет мне, кроме как узнать, что такое «любимый мультфильм программирования»: P
Это был принятый ответ:
Билл Карвин
Спасибо всем за помощь (я бы хотел проголосовать за вас всех дважды)
Мой запрос закончился так (это настоящий)
SELECT
accepted.folio,
COALESCE( inprog.activityin, accepted.activityin ) as activityin,
inprog.participantin,
accepted.completiondate
FROM performance accepted
LEFT OUTER JOIN performance inprog
ON( accepted.folio = inprog.folio
AND inprog.ACTIVITYIN
IN ( 4, 435 ) -- both are ids for inprogress
AND inprog.PARTICIPANTIN != 1 ) -- Ignore the "bot" participant
LEFT OUTER JOIN performance closed
ON( accepted.folio = closed.folio
AND closed.ACTIVITYIN IN ( 10,436, 4, 430 ) ) -- all these are closed or cancelled
WHERE accepted.ACTIVITYIN IN ( 3, 429 ) --- both are id for new
AND accepted.folio IS NOT NULL
AND closed.folio IS NULL;
Теперь мне просто нужно объединиться с другими таблицами для удобочитаемого отчета.
ОРИГИНАЛЬНЫЙ ПОЧТА
Hello.
Я борюсь около 6 часов. теперь с запросом БД (мой давний враг)
У меня есть таблица данных с некоторыми полями, такими как:
table performance(
identifier varchar,
activity number,
participant number,
closedate date,
)
Используется для отслеживания истории билета
Идентификатор : похож на идентификатор клиента (NAF0000001)
действие : fk того, где находится билет (новый, in_progress, отклонен, закрыт и т. Д.)
участник : fk того, кто посещает в этот момент билет
закрыто : дата завершения этой деятельности.
РЕДАКТИРОВАТЬ: Я должен был сказать "дата завершения", а не закрыто. Это дата, когда действие было завершено, необязательно, когда билет был закрыт.
Например, типичная история может быть такой:
identifier|activity|participant|closedate
-------------------------------------------
NA00000001| 1| 1|2008/10/08 15:00|
-------------------------------------------
NA00000001| 2| 2|2008/10/08 15:20|
-------------------------------------------
NA00000001| 3| 2|2008/10/08 15:40|
-------------------------------------------
NA00000001| 4| 4|2008/10/08 17:05|
-------------------------------------------
И участник 1 = Джон, 2 = Скотт, 3 = Майк, 4 = Роб
и активностей 1 = новый, 2 = в процессе, 3 = ожидание для подтверждения, 4 = закрыто
и т.д.. И десятки другой не относящейся к делу информации.
Ну, моя проблема в следующем.
Мне удалось создать запрос, в котором я могу узнать, когда была открыта и закрыта заявка
это так:
select
a.identifier,
a.participant,
a.closedate as start,
b.closedate as finish
from
performance a,
performance b
where
a.activity = 1 -- new
and b.activity = 4 -- closed
and a.identifier = b.identifier
Но я не могу знать, какие билеты не закрыты и кто их посещает.
Пока у меня есть что-то вроде этого:
select
a.identifier,
a.participant,
a.closedate as start
from
performance a
where
a.activity = 1 -- new
and a.identifier not in ( select identifier from performance where activity = 4 ) --closed
Это дает мне всех, кто имеет старт (новый = 1), но не закрыт (закрыт = 4)
Но большая проблема здесь в том, что он печатает участника, который открыл билет, но мне нужен участник, который посещает его. Поэтому я добавляю в запрос действие "inprogress".
select
a.identifier,
a.participant,
a.closedate as start
from
performance a,
performance b
where
a.activity = 1 -- new
and a.identifier not in ( select identifier from performance where activity = 4 ) --closed
and b.identifier = a.identifier
and b.activity = 2 -- inprogress..
Но не все строки, находящиеся в "new", являются "inprogress", и с помощью этого запроса я отбрасываю все из них.
Мне нужно показать всех участников «inprogress», и если билет не «inprogress», он будет отображаться как пустой.
Что-то вроде
identifier|activity|participant|closedate
-------------------------------------------
NA00000002| 1| |2008/10/08 15:00|
-------------------------------------------
NA00000003| 1| |2008/10/08 15:20|
-------------------------------------------
NA00000004| 1| |2008/10/08 15:40|
-------------------------------------------
NA00000005| 2| 4|2008/10/08 15:40|
-------------------------------------------
NA00000006| 2| 4|2008/10/08 15:40|
В этом случае
NA002, NA003 и NA004 находятся в «новом», поэтому ни один участник не отображается
В то время как
NA005 и NA006 являются "входящими (act = 2)", и их посещает грабитель (участник 4)
Итак, я помню, что было нечто, называемое левым внешним соединением или что-то подобное, но я никогда не понимаю этого. Что я хотел бы знать, так это как я могу получить идентификаторы, которые «inprogress» и «new» и которые не закрыты.
Возможно, небольшой отдых поможет мне очистить разум. Если кто-нибудь знает, как это сделать, я буду признателен.
Кстати, я пробовал:
select
a.identifier,
a.participant,
a.closedate as start
from
performance a
left outer join
performance b
on
b.identifier = a.identifier
where
a.activity = 1 -- new
and a.identifier not in ( select identifier from performance where activity = 4 ) --closed
and b.activity = 2 -- inprogress..
Но дает мне тот же результат, что и предыдущий (сбросить только в "новые" записи)