2017-03-29 3 views
1

Am Anfang tut mir wirklich leid für mein schlechtes Englisch.SQL. Ich brauche zwei Reihen basierend auf Daten zu verbinden

ich brauche Reihen mit der gleichen ID vergleichen und wenn sie richtig sind verbinden sie:

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 

Reihen, von denen ich bereits Daten nehmen shoul gelöscht werden.

Effekt sollte sein:

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 - ist unverändert, da ein Teil des Datums unterscheidet.

83 - sind vergleichen dann Zeile mit weniger Daten sollte entfernt werden.

198 - Übereinstimmende Liniendaten werden der ersten übereinstimmenden Zeile zugewiesen und die Zeile wird gelöscht. zweite Zeile ist unverändert, weil ein Teil des Datums anders ist.

2070 - Alle Zeilen werden zu einer zusammengeführt. Die angehängten Zeilen werden gelöscht.

Ich habe versucht, Make-Code:

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

Was macht der 'N/A'-Wert in einer Datumsspalte? Speichern Sie Ihre Daten als Text? –

Antwort

-1

Wenn ich in Ihrer Situation wäre, anstatt zu versuchen, die testcheck Tabelle zu aktualisieren, würde ich eine Abfrage verwenden, um die Daten in dem Format zu extrahieren, ich wollte, und dann legen Sie einfach, dass in eine neue Tabelle mit der gleichen Struktur:

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; 

danach, können Sie die ursprüngliche Tabelle löschen und dann möglicherweise umbenennen newtestcheck zurück zu testcheck wenn Sie möchten.

Hinweis: Sie haben einen sehr verdächtigen Blick N/A Datenpunkt in einer der Datumsspalten. Wenn literal, dann würde es bedeuten, dass Sie Ihre Daten als Text speichern, und dann müsste meine Abfrage geändert werden.

+0

Was ist, wenn zwei Date2's. Date3's oder Date4's sind anders? – toonice

Verwandte Themen