2011-12-23 14 views
2

これは以前stackoverflow(Returning nearest date to date in a different table)で解決されたクエリから続きますが、今後はさらに開発したいと考えています。追加のテーブル情報を含む複数のテーブルから関連する日付を返す

私が持っているSQLはこれです:

SELECT * 
FROM (SELECT O_ASSESSMENTS.ASM_SUBJECT_ID as "P Number", 
      O_ASSESSMENTS.ASM_ID as "Assessment ID", 
      O_ASSESSMENTS.ASM_START_DATE as "Assessment Start", 
      O_ASSESSMENTS.ASM_END_DATE as "Assessment End", 
      O_SERVICE_EVENTS.SEV_ID as "Event ID", 
      O_SERVICE_EVENTS.SEV_ACTUAL_DATE as "Event Start", 
      O_SERVICE_EVENTS.SEV_OUTCOME_DATE as "Event End", 
      ROUND(O_ASSESSMENTS.ASM_START_DATE -O_SERVICE_EVENTS.SEV_ACTUAL_DATE,0) as "Likely", 
      row_number() over(PARTITION BY O_ASSESSMENTS.ASM_ID          
           ORDER BY abs(O_ASSESSMENTS.ASM_START_DATE - O_SERVICE_EVENTS.SEV_ACTUAL_DATE))as "Row Number"    
     FROM O_ASSESSMENTS 
     JOIN O_SERVICE_EVENTS 
     ON O_ASSESSMENTS.ASM_SUBJECT_ID = O_SERVICE_EVENTS.SEV_SUBJECT_ID 
     Where O_SERVICE_EVENTS.SEV_CODE IN ('ICS_E3','CPINVEST') AND 
      O_ASSESSMENTS.ASM_QSA_ID IN ('AA1329','AA521')) 
WHERE "Row Number" = 1 

は基本的に、我々は二つのテーブルがある - o_assessmentsとo_service_eventsを、このSQLは評価に最寄りのサービスイベントを返しています。ここでは、より複雑な情報をクエリに追加して、エンドユーザーにとってより便利なもの、つまりチーム名とワーカー名を追加したいと考えています。

残念ながら、チームとワーカーは別のテーブル(o_responsibilities)に再度あり、as_idからres_rec_idへのo_assessmentsにリンクされています。

問題は、私は実際にどのように上記のSQLにこのテーブルを呼び出すか分からない - ので、任意のアドバイスは本当に感謝します!

「可能性のある」フィールドに0の差がある場合にのみ、対応するイベントを返すように既存のクエリを調整することも可能かどうか疑問に思っていました。私はどこにそれを追加することができます知っているが、私は

and "Likely" = 0 

行を追加する場合にのみ(イベントに対応することなく、すなわちアセスメント)すべての問題を強調しませんイベント、との評価を返します。

私はSQLですべての時間を学んでいますが、現時点では私のことを本当に超えているようなものがたくさんあるので、アドバイスをいただければ幸いです。元のクエリを修正するか、新しいクエリを開始するかはわかりませんでしたので、誤ってルールを侵害していないことを願っています。

編集:

さて、マルコソリューション以下、これは私が働いているものです。

SELECT 
* 
FROM 
(SELECT 
OAS.ASM_SUBJECT_ID as "P Number", 
OAS.ASM_ID as "Assessment ID", 
OAS.ASM_START_DATE as "Assessment Start", 
OAS.ASM_END_DATE as "Assessment End", 
OAS.ASM_AUTH_DATETIME as "Authorisation Date", 
nvl(olm_bo.get_ref_desc(OAS.ASM_OUTCOME,'ASM_OUTCOME'),'') as "Outcome", 
nvl(olm_bo.get_org_name(ORE.RES_PARTY_OUN_ID),'') as "Team", 
nvl(olm_bo.get_per_name(ORE.RES_PARTY_ID),'') as "Worker", 
OSE.SEV_ID as "Event ID", 
OSE.SEV_ACTUAL_DATE as "Event Start", 
OSE.SEV_OUTCOME_DATE as "Event End", 
ROUND(OAS.ASM_START_DATE -OSE.SEV_ACTUAL_DATE,0) as "Likely", 
row_number() over(PARTITION BY OAS.ASM_ID     
ORDER BY 
abs(OAS.ASM_START_DATE - OSE.SEV_ACTUAL_DATE))as "Row Number" 
FROM O_ASSESSMENTS OAS  
INNER JOIN O_RESPONSIBILITIES ORE ON OAS.ASM_ID = ORE.RES_REC_ID 
AND ORE.RES_PARTY_OUN_ID = 'TEAM' 
LEFT JOIN O_SERVICE_EVENTS OSE ON OAS.ASM_SUBJECT_ID = OSE.SEV_SUBJECT_ID 
AND    
OSE.SEV_CODE IN ('EVENT') 
AND    
ROUND(OAS.ASM_START_DATE - OSE.SEV_ACTUAL_DATE,0) >= -7 
AND 
ROUND(OAS.ASM_START_DATE - OSE.SEV_ACTUAL_DATE,0) <= 7 
Where OAS.ASM_QSA_ID IN ('ACODE') 
AND 
nvl(olm_bo.get_ref_desc(OAS.ASM_OUTCOME,'ASM_OUTCOME'),'') <> 'Abandon') WHERE "Row Number" = 1 
+0

はインナーセレクトから欠けていますか?具体的には、結合の周りに... "AND"の後に "SYNTAX"エラーが発生するはずの "WHERE"があります。 – xQbert

+0

申し訳ありませんが、コードを操作して間違ったコピーを...間もなくコピーしました! – bawpie

答えて

1

試してみてください:

SELECT * 
FROM (SELECT OAS.ASM_SUBJECT_ID as "P Number", 
      OAS.ASM_ID as "Assessment ID", 
      OAS.ASM_START_DATE as "Assessment Start", 
      OAS.ASM_END_DATE as "Assessment End", 
      ORE.TEAM, 
      ORE.WORKER, 
      OSE.SEV_ID as "Event ID", 
      OSE.SEV_ACTUAL_DATE as "Event Start", 
      OSE.SEV_OUTCOME_DATE as "Event End", 
      ROUND(OAS.ASM_START_DATE -OSE.SEV_ACTUAL_DATE,0) as "Likely", 
      row_number() over(PARTITION BY OAS.ASM_ID          
           ORDER BY abs(OAS.ASM_START_DATE - OSE.SEV_ACTUAL_DATE))as "Row Number"    
     FROM O_ASSESSMENTS OAS 
     LEFT JOIN O_RESPONSIBILITIES ORE 
     ON OAS.ASM_ID = ORE.RES_REC_ID 
     LEFT JOIN O_SERVICE_EVENTS OSE 
     ON OAS.ASM_SUBJECT_ID = OSE.SEV_SUBJECT_ID AND 
      OSE.SEV_CODE IN ('ICS_E3','CPINVEST') AND 
      ROUND(OAS.ASM_START_DATE - OSE.SEV_ACTUAL_DATE,0) = 0 
     Where OAS.ASM_QSA_ID IN ('AA1329','AA521')) 
WHERE "Row Number" = 1 

注これはRES_REC_IDがO_RESPONSIBILITIES上で一意の識別子であることを前提としていることを、このような

何かがトリックを行う必要があります。

+0

ありがとう、これは完全に動作しているようです。フィードバックの遅れに対する謝罪。 – bawpie

1

新しいものを開始することは正しい行動コースです。 「スコープを追加する」という質問を編集するのは良い方法ではありません。これは「スコープを追加する」に分類されるので、新しい質問が正しいアプローチでした。

SELECT 
ID, "Assessment ID", 
"Assessment Start", "Assessment End", "Event ID", 
"Event Start", "Event End", Likely, Team_name, Worker_name 
FROM 
    (SELECT 
    O_ASSESSMENTS.ASM_SUBJECT_ID as "ID", 
    O_ASSESSMENTS.ASM_ID as "Assessment ID", 
    O_ASSESSMENTS.ASM_START_DATE as "Assessment Start", 
    O_ASSESSMENTS.ASM_END_DATE as "Assessment End", 
    O_SERVICE_EVENTS.SEV_ID as "Event ID", 
    O_SERVICE_EVENTS.SEV_ACTUAL_DATE as "Event Start", 
    O_SERVICE_EVENTS.SEV_OUTCOME_DATE as "Event End", 
    ROUND(O_ASSESSMENTS.ASM_START_DATE -O_SERVICE_EVENTS.SEV_ACTUAL_DATE,0) as "Likely", 
    row_number() over(PARTITION BY O_ASSESSMENTS.ASM_ID          
    ORDER BY abs(O_ASSESSMENTS.ASM_START_DATE - 
    O_SERVICE_EVENTS.SEV_ACTUAL_DATE)) as "Row Number", 
    RES.TEAM_NAME, 
    RES.WORKER_NAME 
    FROM O_ASSESSMENTS 
    INNER JOIN O_SERVICE_EVENTS 
    ON O_ASSESSMENTS.ASM_SUBJECT_ID = O_SERVICE_EVENTS.SEV_SUBJECT_ID 
    INNER JOIN O_Responsibilities res 
    ON O_Assessments.ASM_ID = res.res_rec_ID 
    WHERE O_SERVICE_EVENTS.SEV_CODE IN ('ICS_E3','CPINVEST') 
    AND O_ASSESSMENTS.ASM_QSA_ID IN ('AA1329','AA521')) InnerTable 
WHERE "Row Number" = 1 and (Likely = 0 or LIKELY is null) 

私はここにいたすべてが、

  1. あなたは、名前が提供されていなかったのにそう、私はTEAM_NAMEとWORKER_NAME仮定を求め
  2. 含まれて列の内側のSELECT文であなたの参加条件を追加しましたINNERとOUTERのselectステートメントで
  3. 元の投稿へのコメントのある場所の前にANDを削除しました
  4. テーブルの名前にエイリアスを追加しましたある時点で外側のテーブルに のct incase joinが必要です。
  5. 外側の句に(おそらく= 0かそうである可能性が高い)を追加しました
  6. ここで読めるように再フォーマットされたSQL。

上記の5つでは、それほど正確ではない可能性がありますが、サービス日付のない評価に関するご意見は完全には分かりません。そうであれば、すべてのアセスメントと関連サービスが存在する場合、アセスメントとサービス間の結合はインナーではなく左結合でなければなりません(MUST)。現在、関連サービスを持っている評価だけを取得しています。すべての評価が必要な場合は、他の変更が必要な場合があります。

そう...

FROM O_ASSESSMENTS 
    INNER JOIN O_SERVICE_EVENTS 
    ON O_ASSESSMENTS.ASM_SUBJECT_ID = O_SERVICE_EVENTS.SEV_SUBJECT_ID 

は(だけ左にINNERが変更された)

FROM O_ASSESSMENTS 
    LEFT JOIN O_SERVICE_EVENTS 
    ON O_ASSESSMENTS.ASM_SUBJECT_ID = O_SERVICE_EVENTS.SEV_SUBJECT_ID 

になるとそれがないLEFTが参加した場合、責任レコードを持っている必要とされるであろう、常に評価を前提としていそこにも。

最後に、SEV_Actual_Dateがnullの場合にLIKELYの結果をどのように返すかについて考える必要があります。どのような価値があるはずですか?

+0

残念なことに、残念なことに1年前に仕上げるので、1月より前にテストする機会がないかもしれませんが、確かに一見あります。特に必要なヘルプであるので、あなたのしたことを説明してくれてありがとう! – bawpie

+0

@xQbert - これは、0でもなくてもなく、評価が返されません。 –

+0

私は何かが欠けている...(Likely = 0か、おそらくnullです)それを行う必要があります。しかし、INNER結合は現在、NULL値を防止しています。 OPの要件を完全に理解していなかったためです。 – xQbert

0

各IDのインラインビューにo_responsibilitiesを参加させ、その列をクエリに含めることができます。

likelyがエイリアスであるため、インラインビューではなく、外側のクエリ(行番号の基準)にwhere likely = 0ビットを配置する必要があることに注意してください。イベントのない評価を強調したい場合は、left joinを実行し、sev_id is nullという条件を追加する必要があります。

select * 
from (select o_assessments.asm_subject_id      as "P Number", 
        o_assessments.asm_id        as "Assessment ID", 
        o_assessments.asm_start_date      as "Assessment Start", 
        o_assessments.asm_end_date      as "Assessment End", 
        o_service_events.sev_id       as "Event Id", 
        o_service_events.sev_actual_date     as "Event Start", 
        o_service_events.sev_outcome_date     as "Event End", 
        o_responsibilities.[WHATEVER]      as "Team/Worker Stuff", 
        round(o_assessments.asm_start_date - o_service_events.sev_actual_date,0) 
                    as "Likely", 
        row_number() over (partition by o_assessments.asm_id          
            order by  abs(o_assessments.asm_start_date - o_service_events.sev_actual_date)) 
                    as rn 
     from  o_assessments 
     left join o_service_events 
     on  o_service_events.sev_subject_id     = o_assessments.asm_subject_id 
     left join o_responsibilities 
     on  o_responsibilities.res_rec_id      = o_assessments.asm_id 
     where  o_service_events.sev_code       in ('ICS_E3','CPINVEST') 
     and  o_assessments.asm_qsa_id       in ('AA1329','AA521')) 
where rn = 1 
and (likely = 0 or sev_id is null); 
+0

これは、0とNULLのいずれも存在しない可能性がある場合に評価を返しません。 –

+0

それはOPが尋ねたものです – Xophmeister

+0

いいえ、OPはしませんでした。 xQbertの答えについての私のコメントをより明確にするために見てください。 –

関連する問題