2016-10-13 9 views
1

SQL Serverで作業しています。私は3つのテーブルTableA,TableBTableMainを持っていて、Date,StartTimeFinishTimeというカラムを持っています。SQL Serverの結合テーブルからデータを優先的に取得する方法

これらの3つの列の値を取得するSQL文をTableMainから作成する必要があります。同じ日付がTableAに存在する場合、StartTimeの値がそれから来るはずです。それ以外の場合はTableMainの値を使用してください。同様に、FinishTimeTableBに存在する場合、最終出力ではその値をTableMainに置き換える必要があります。

私はこれらの3つのテーブルを結合することでやりたいと思います。次の表は、これらの3つのテーブルのデータと最終的に期待されるクエリ出力を示しています。

テーブルA

Date  StartTime 
10/14/2016 11:00 AM 
10/16/2016 10:00 AM 
10/18/2016 11:30 AM 

テーブルB

Date  FinishTime 
10/15/2016 3:00 PM 
10/16/2016 4:00 PM 
10/17/2016 6:30 PM 
10/18/2016 5:00 PM 

TableMain

Date  StartTime FinishTime 
10/14/2016 8:00 AM  10:00 PM 
10/15/2016 8:00 AM  10:00 PM 
10/16/2016 8:00 AM  10:00 PM 
10/17/2016 8:00 AM  10:00 PM 
10/18/2016 8:00 AM  10:00 PM 

所望の出力:

10/14/2016 11:00 AM 10:00 PM 
10/15/2016 8:00 AM  3:00 PM 
10/16/2016 10:00 AM 4:00 PM 
10/17/2016 8:00 AM  6:30 PM 
10/18/2016 11:30 AM 5:00 PM 
+0

左結合と派生テーブルの結果が必要です。下の私の答えを見てください。 – JonH

+1

sqlタグで質問を更新して編集する人がいれば最高ですmarc_s thanks @marc_s – JonH

+0

@JonH:aw、ありがとう、Jon! –

答えて

0

本当にテストしていないが、このような何か:ここでの鍵はあなたには、いくつかの左を使用することである

SELECT 
    t.DateVal, 
    t.Start, 
    t.Finish 
FROM 
(
SELECT 
    tm.DateVal AS DateVal, 
    CASE WHEN a.Start IS NOT NULL THEN a.Start ELSE tm.Start END AS Start, 
    CASE WHEN b.Finish IS NOT NULL THEN b.Finish ELSE tm.Finish END AS Finish 
FROM 
    TableMain tm 
LEFT JOIN 
    TableA a 
ON 
    a.DateVal = tm.DateVal 
LEFT JOIN 
    TableB b 
ON 
    b.DateVal = tm.DateVal 
) t 

は、(この場合はtで)case文、および派生テーブルの結果を結合します。私の列名に注意してください。列名が何であるかを変更するだけです。これはうまくいくはずです。

1

COALESCEは、すべてのCASE文なしに、ここにも動作します:

SELECT tablemain.date, 
COALESCE(tablea.starttime, tablemain.starttime), 
COALESCE (tableb.finishtime, tablemain.finishtime) 
FROM tablemain 
LEFT JOIN tablea 
ON tablemain.date = tablea.date 
LEFT JOIN tableb 
ON tablemain.date = tableb.date 

COALESCEは、シリーズの最初の非NULL値をとります。だから、もしテーブルaに開始日があれば、その日がかかるでしょう。そうでない場合は、テーブルのメインから開始日が取られます。終了日とテーブルbについて同じロジックが維持されます

関連する問題