4 Stimmen

SQL Server-Duplikatentfernung mit Pfiff

SQL Server 2008, ich habe eine Tabelle wie diese geerbt (74k Zeilen):

create table #mess (keycol char(36) , name1 varchar(254) , name2 varchar(254), valuex varchar(254) )
insert into #mess values ('971EC307-8514-450D-AE3A-4E25EA3F3A10' , 'a' , '' , '' )
insert into #mess values ('971EC307-8514-450D-AE3A-4E25EA3F3A10' , '' , 'a' , 'value-a' )
insert into #mess values ('04FD0C0B-FC90-405A-BFD6-C3AF2516E51F' , 'b' , '' , 'value-b' )
insert into #mess values ('578F2893-15E6-4877-9FE6-AC2F4F351143' , 'c' , '' , 'value-c' )
insert into #mess values ('04FD0C0B-FC90-405A-BFD6-C3AF2516E51F' , '' , 'b' , '' )
insert into #mess values ('FAFCBDFE-D49E-4566-882D-0B6628DA59CC' , '' , 'd' , 'value-d' )

Daraus ergibt sich diese Ergebnismenge:

keycol                               name1   name2    valuex
------------------------------------ ------- -------- ------------
971EC307-8514-450D-AE3A-4E25EA3F3A10 a                
971EC307-8514-450D-AE3A-4E25EA3F3A10         a        value-a
04FD0C0B-FC90-405A-BFD6-C3AF2516E51F b                value-b
578F2893-15E6-4877-9FE6-AC2F4F351143 c                value-c
04FD0C0B-FC90-405A-BFD6-C3AF2516E51F         b        
FAFCBDFE-D49E-4566-882D-0B6628DA59CC         d        value-d

Ich muss es so machen (Duplizieren und Zusammenfassen der Daten, basierend auf dem Zeitpunkt keycol zwischen zwei Zeilen übereinstimmt, und mit name1 si name2 leer ist und umgekehrt, aber immer mit name1 und immer mit nicht leeren valuex Spalte). Alle Ideen sind willkommen.

Gracias.

keycol                               name1   valuex
------------------------------------ ------- ------------
971EC307-8514-450D-AE3A-4E25EA3F3A10 a       value-a
04FD0C0B-FC90-405A-BFD6-C3AF2516E51F b       value-b
578F2893-15E6-4877-9FE6-AC2F4F351143 c       value-c
FAFCBDFE-D49E-4566-882D-0B6628DA59CC d       value-d

1voto

Chains Punkte 12031

Übrigens: Die 3 Spalten auf der rechten Seite sind im Wesentlichen identisch. Sie können die äußerste rechte Spalte (Werte wie "Wert-a" usw.) straffrei streichen und dann die beiden anderen Spalten kombinieren.

Wie auch immer - es gibt verschiedene Möglichkeiten, DISTINCT oder alternativ GROUP BY zu verwenden, um das Gewünschte zu erhalten:

DISTINCT verwenden:

SELECT DISTINCT
   keycol, 
   Coalesce(NULLIF(name1,''), name2) as name1,
   'Value-' + Coalesce(NULLIF(name1,''), name2) as valuex
FROM
   Table

Verwendung von GROUP BY:

SELECT
   keycol, 
   Coalesce(max(nullif(name1,'')), max(name2)) as name1,
   max(valuex)
FROM
   table
Group By
   keycol

0voto

Marc B Punkte 347897

Sie können die Funktion COALESCE() verwenden. Sie nimmt eine beliebige Anzahl von Argumenten entgegen und gibt den ersten Nicht-NULL-Wert als Ergebnis zurück.

bearbeiten: SELECT keycol, COALESCE(name1, name2), valuex GROUP BY keycol

Ok. Offensichtlich falsch... danke für den Hinweis. Ich gehe jetzt einfach und wache auf.... montags auf...

0voto

Derek Kromm Punkte 20844

So etwas wie das hier?

create table #mess (keycol char(36) , name1 varchar(254) , name2 varchar(254), valuex varchar(254) )
insert into #mess values ('971EC307-8514-450D-AE3A-4E25EA3F3A10' , 'a' , '' , '' )
insert into #mess values ('971EC307-8514-450D-AE3A-4E25EA3F3A10' , '' , 'a' , 'value-a' )
insert into #mess values ('04FD0C0B-FC90-405A-BFD6-C3AF2516E51F' , 'b' , '' , 'value-b' )
insert into #mess values ('578F2893-15E6-4877-9FE6-AC2F4F351143' , 'c' , '' , 'value-c' )
insert into #mess values ('04FD0C0B-FC90-405A-BFD6-C3AF2516E51F' , '' , 'b' , '' )
insert into #mess values ('FAFCBDFE-D49E-4566-882D-0B6628DA59CC' , '' , 'd' , 'value-d' )

select * from #mess

select 
    n1.keycol, coalesce(n1.name1, n2.name1), n1.valuex 
from
    (
        select keycol, max(nullif(name1, '')) name1, max(nullif(valuex, '')) valuex
        from #mess 
        group by keycol) n1
    inner join  (
        select keycol, max(nullif(name2, '')) name1, max(nullif(valuex, '')) valuex
        from #mess 
        group by keycol) n2
        on  n1.keycol = n2.keycol

drop table #mess

0voto

mwigdahl Punkte 15620

Es sieht so aus, als ob die Datenstruktur so beschaffen ist, dass Sie immer nur die Zeile mit dem Nicht-NULL-Wertx für jedes keycol wollen. Sie sollten in der Lage sein, dies zu erreichen und name1 und name2 zusammenzufassen, indem Sie die NULL valuex Zeilen mit einer UNION wie folgt eliminieren:

SELECT keycol, name1, valuex
FROM tablename
WHERE valuex != '' AND name1 != ''
UNION
SELECT keycol, name2 AS name1, valuex
FROM tablename
WHERE valuex != '' AND name2 != ''

Wenn es für jedes keycol immer nur eine gültige valuex-Zeile gibt, sollte dies funktionieren. Wenn Ihre Daten nicht so aufgebaut sind, lassen Sie es mich wissen, und ich werde sie weiter ändern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X