2016-08-05 10 views
0

を取得します。は、私は次のような場合があり、特定の日のために他のレコード

T1:

--------------------- 
oDate   oVal 
--------------------- 
2016-07-30 30 
2016-07-31 40 
2016-08-01 35 
2016-08-02 50 

T2:

-------------------- 
oDate   oVal 
--------------------- 
2016-07-30 56 
2016-07-31 34 

t2は '2016年8月1日' は空であり、両方

t1 --> oDate datetime, oVal int<br> 
t2 --> oDate datetime, oVal int<br> 

LETは、データがあると言いますフィールドoDateおよびoVal。私は次のような結果が欲しい

:テーブルt2は「2016年8月1日」以来、空のため

--------------------------- 
oDate   oVal1  oVal2 
--------------------------- 
2016-07-30  30  56 
2016-07-31  40  34 
2016-08-01  35  35 
2016-08-02  50  50 

を、oVal2の値はoVal1からコピーです。

どのようにSQLクエリでそれを行うことができますか? ありがとうございます。

+0

t1がミスインの場合t2からのいくつかの日付? – Serg

+0

t1は常に利用可能です。 – Haminteu

+0

@Pawełのクエリは解決策です。 – Serg

答えて

3

使用left joincase次のように:

SELECT T1.oDate, T1.oVal oVal1, CASE WHEN T2.oVal IS NULL THEN T1.oVal ELSE T2.oVal END oVal2 
FROM T1 
LEFT JOIN T2 ON T1.oDate=T2.oDate 

がデモを見てみましょう:

WITH T1 AS 
(
    SELECT * FROM (VALUES 
    (CONVERT(datetime, '2016-07-30'), 30), 
    (CONVERT(datetime, '2016-07-31'), 40), 
    (CONVERT(datetime, '2016-08-01'), 35), 
    (CONVERT(datetime, '2016-08-02'), 50)) T(oDate, oVal) 
), T2 AS 
(
    SELECT * FROM (VALUES 
    (CONVERT(datetime, '2016-07-30'), 56), 
    (CONVERT(datetime, '2016-07-31'), 34)) T(oDate, oVal) 
) 
SELECT T1.oDate, T1.oVal oVal1, CASE WHEN T2.oVal IS NULL THEN T1.oVal ELSE T2.oVal END oVal2 
FROM T1 
LEFT JOIN T2 ON T1.oDate=T2.oDate 
+0

こんにちは、ありがとう。しかし、日付が'2016-07-31 'を超えるとLEFT JOINを「アクティブにする」を選択するにはどうすればよいですか? – Haminteu

+0

おそらくOPはFULL JOINが必要です。 – Serg

+0

日付が '2016-07-31'より大きい場合、LEFT JOINはT2の側でNULLを生成します。これは 'CASE'式の場合です。前述のように、T1は常に利用可能です。 –

0

SEL a.odate、a.oval、合体(b.oval、a.ovalを) from t1 a left join t2 b on a.odate = b.odate

関連する問題