我知道 stackoverflow 会帮助我,而不是知道什么是“最喜欢的编程卡通”:P
这是被接受的答案: Bill Karwin
感谢大家的帮助(我想给大家投票)
我的查询结果是这样的(这是真实的)
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;
现在我只需要加入其他表格即可获得人类可读的报告。
原帖
你好。
我挣扎了大约6个小时。现在有一个数据库查询(我的长期克星)
我有一个包含一些字段的数据表,例如:
table performance(
identifier varchar,
activity number,
participant number,
closedate date,
)
它用于跟踪票证的历史记录
标识符:是一个客户 ID,如 ( NAF0000001 )
活动:是票的位置(新的、进行中的、拒绝的、关闭的等)
参与者:是当时参加票的人的fk
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=jonh, 2=scott, 3=mike, 4=rob
和活动 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
那就是给我所有有开始( new = 1 )但没有关闭( closed = 4 )的人
但这里最大的问题是它打印了打开票的参与者,但我需要参加它的参与者。所以我将“进行中”活动添加到查询中。
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..
但并非“新”中的所有行都是“进行中”,并且通过该查询我删除了所有行。
我需要的是显示所有“进行中”的参与者,如果票不是“进行中”,它将显示为空。
类似的东西
标识符|活动|参与者|关闭 ------------------------------------------ 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 正在“inprgress (act = 2 )”并且他们正在被 rob (参与者 4 ) 参加
所以我记得有一个东西叫做左外连接或类似的东西,但我从来没有理解过。我想知道的是如何获取“正在进行”和“新”且未关闭的标识符。
可能稍微休息一下会帮助我理清思路。如果有人知道该怎么做,我将不胜感激。
顺便说一句,我试过:
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..
但是给了我与以前相同的结果(仅删除“新”记录)