2016-10-13 15 views
0

sqlserverを使用しています。私は3つのテーブル、TableA、TableBとTableMain、Date、StartTimeとFinishTimeカラムを持っています。これらの3つのテーブルは共通のCustomerIDで結合できます。残念ながら、TableMainはday_of_weekを持ち、他の2つは日付を持っています。私は、日付、day_of_weekとcustomeridでクエリする必要があります。下のSQLでは、土曜日に対応する日付2016-10-14を使用しています。私が使用したSQLは以下の通りです。しかし、SQLはコンパイルされません。私は "キーワード 'の近くで誤った構文を' 'エラーにしています。結合テーブルがSQLに存在する場合、値を置換する方法

TableAの

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

TableBの

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

TableMain

CustomerID Day_of_week   StartTime FinishTime 
100   Monday    8:00 AM  10:00 PM 
100   Tuesday    8:00 AM  10:00 PM 
100   Wednesday   8:00 AM  10:00 PM 
100   Thursday   8:00 AM  10:00 PM 
100   Friday    8:00 AM  10:00 PM 
100   Saturday   8:00 AM  10:00 PM 

予想される出力:

CustomerID Day_of_the_week   StartTime FinishTime 
100   Saturday    11:00 AM 10:00 PM 

SQL私がこれまで持っている:あなたが見逃している

select 
    t.StartTime, t.FinishTime, t.CustomerID 
from 
    (select 
      tm.CustomerID as CustomerID, 
      case 
      when tb.FinishTime is not null 
       then tb.FinishTime 
       else tm.FinishTime   
      as FinishTime, 
      case 
      when ta.StartTime is not null 
       then ta.StartTime 
       else tm.StartTime 
      as StartTime, 
     from 
      TableMain tm 
     left join 
      TableB tb on tm.CustomerID = tb.CustomerID 
     left join 
      TableA ta on tm.CustomerID = ta.CustomerID 
     where 
      tm.day_of_week = 'SATURDAY' 
      and tb.Date = '2016-10-14' 
      and ta.Date = '2016-10-14') t 

答えて

2

両方CASE文が

Select 
......... 
CASE 
    WHEN tb.FinishTime IS NOT NULL THEN tb.FinishTime 
    ELSE tm.FinishTime 
END AS FinishTime, --Here 
CASE 
    WHEN ta.StartTime IS NOT NULL THEN ta.StartTime 
    ELSE tm.StartTime 
END AS StartTime --Here & remove the comma 
......... 

しかし、それはCOALESCEを使用して簡略化することができ、それが返されますしENDを追加します最初のNOT NULLの値を列リストから削除します。

COALESCE(tb.FinishTime, tm.FinishTime) AS FinishTime, 
COALESCE(ta.StartTime, tm.StartTime) AS StartTime 

論理間違いはあなたがが暗黙のうちにINNER JOINLEFT JOINを変換Where句のLeft table列をフィルタリングしているでした。ここで正しいクエリは

SELECT tm.CustomerID       AS CustomerID, 
     COALESCE(tb.FinishTime, tm.FinishTime) AS FinishTime, 
     COALESCE(ta.StartTime, tm.StartTime) AS StartTime 
FROM TableMain tm 
     LEFT JOIN TableB tb 
       ON tm.CustomerID = tb.CustomerID 
       AND tb.Date = '2016-10-14' 
     LEFT JOIN TableA ta 
       ON tm.CustomerID = ta.CustomerID 
       AND ta.Date = '2016-10-14' 
WHERE tm.day_of_week = 'SATURDAY' 
+0

ありがとうございました!それは魅力のように働いた。また、その背後にある論理を説明することに感謝してくれました。 – Massey

関連する問題