2017-03-29 5 views
1

私は本当に私の悪い英語のために申し訳ありません。SQL。私は日付に基づいて2つの行を接続する必要があります

私は同じIDを持つ行を比較する必要があり、それらが正しい場合は、それらを接続

:私はすでにデータを取得している、そこから

id Date1  Date2   Date3  Date4 
1210 2013-01-09 NULL  2018-04-10 2023-04-11 
1210 2013-09-01 2018-10-04 2023-11-04  NULL 
    83 2009-11-17 NULL  2014-11-30 2016-11-30 
    83 2009-11-17 NULL  NULL  2016-11-30 
198 2008-04-22 NULL  2013-04-30 2015-04-30 
198 2008-04-22 2013-04-30 2014-04-30 2015-04-30 
198 2008-04-22 NULL  NULL  NULL 
2070 1997-06-18 NULL  2002-09-30  N/A 
2070 1997-06-18 2001-09-30 2002-09-30  NULL 
2070 1997-06-18 NULL  NULL  2002-09-30 

行が削除されshoul。

効果は次のようになります。

id Date1  Date2   Date3  Date4 
1210 2013-01-09 NULL  2018-04-10 2023-04-11 
1210 2013-09-01 2018-10-04 2023-11-04  NULL 
    83 2009-11-17 NULL  2014-11-30 2016-11-30 
198 2008-04-22 NULL  2013-04-30 2015-04-30 
198 2008-04-22 2013-04-30 2014-04-30 2015-04-30 
2070 1997-06-18 2001-09-30 2002-09-30 2002-09-30 

1210 - 日付の一部が異なるため変更されません。

83 - 比較するデータが少ない行を削除する必要があります。

198 - 最初に一致する行に一致する行データが割り当てられ、その行が削除されます。 2行目日付の一部が異なるため変更されません。

2070 - すべての行が1つにマージされます。添付された行は削除されます。

私が試したメークコード:私はあなたの状況にあった場合

update tb 
set tb.Date1 = case 
        when tj.Date1 is not null and (tb.Date1 is null or tb.Date1 = 'n/a') then tj.Date1 end, 
tb.Date2 = case 
        when tj.Date2 is not null and (tb.Date2 is null or tb.Date2 = 'n/a') then tj.Date2 end, 
tb.Date3 = case 
        when tj.Date3 is not null and (tb.Date3 is null or tb.Date3 = 'n/a') then tj.Date3 end, 
tb.Date4 = case 
        when tj.Date4 is not null and (tb.Date4 is null or tb.Date4 = 'n/a') then tj.Date4 end 
from            
testcheck as tb inner join testcheck as tj on tb.Product_ID= tj.Product_ID 
where (tb.Date1 = tj.Date1 or tb.Date1 is null or tj.Date1 is null or tb.Date1 = 'n/a' or tj.Date1 = 'n/a') 
and (tb.Date2 = tj.Date2 or tb.Date2 is null or tj.Date2 is null or tb.Date2 = 'n/a' or tj.Date2 = 'n/a') 
and (tb.Date3 = tj.Date3 or tb.Date3 is null or tj.Date3 is null or tb.Date3 = 'n/a' or tj.Date3 = 'n/a') 
and (tb.Date4 = tj.Date4 or tb.Date4 is null or tj.Date4 is null or tb.Date4 = 'n/a' or tj.Date4 = 'n/a') 
+0

「N/A」の値は、日付列で何をしていますか?日付をテキストとして保存していますか? –

答えて

-1

は、むしろtestcheckテーブルを更新しようとするよりも、私はその後、私が望んでいたフォーマットでデータを抽出するためにクエリを使用し、かつますこの後

CREATE TABLE newtestcheck (id int, Date1 datetime, Date2 datetime, Date3 datetime, 
          Date4 datetime); 

INSERT INTO newtestcheck 
SELECT id, 
     Date1, 
     MAX(Date2), 
     MAX(Date3), 
     MAX(Date4) 
FROM testcheck 
GROUP BY id, Date1; 

、あなたは元のテーブルをドロップすることができますし、あなたが望むならば、おそらくtestchecknewtestcheckバックの名前を変更します。ちょうど同じ構造を持つ新しいテーブルにすることを挿入します。

注:N/Aのデータポイントは、日付の列のいずれかに非常に疑わしいと思われます。リテラルの場合は、日付をテキストとして保存することになり、クエリを変更する必要があります。

+0

2つのDate2の場合はどうなりますか? Date3とDate4の違いは? – toonice

関連する問題