「お気に入りのプログラミング漫画」が何であるかを知る以外に、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時間くらい悩んでいます。DBクエリを使用するようになりました(私の長年の宿敵)
次のようないくつかのフィールドを持つデータテーブルがあります。
table performance(
identifier varchar,
activity number,
participant number,
closedate date,
)
チケットの履歴を追跡するために使用されます
識別子: ( NAF0000001 ) のような顧客 ID です。
activity : チケットがどこにあるかの fk です (新規、進行中、拒否、クローズなど)
参加者: その時点でチケットに参加している人の 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=ジョン、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
つまり、開始した ( 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..
しかし、前と同じ結果が得られます(「新しい」レコードのみをドロップします)