2011-07-25 4 views
4

SQL Server 2008, я унаследовал таблицу, как это (74k строк):SQL удаления дубликатов сервера с твист

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') 

Что делает этот результирующий набор:

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 

Мне нужно сделать он вроде этого (дедуплицирование и сворачивание данных на основе того, когда keycol соответствует между двумя строками, и используя name1, если name2 пуст и наоборот, но всегда использует name1 и всегда использует непустые valuex). Все идеи были оценены.

Спасибо.

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 
+0

- это пробелы пустой или пустой строки? – SQLMason

+0

Это пустые строки. Благодарю. – Snowy

ответ

0

Вы можете использовать функцию COALESCE(). Он принимает любое количество аргументов и возвращает в качестве результата первое значение, отличное от NULL.

редактировать: ВЫБОР keycol, СОАЬЕЗСЕ (имя1, имя2), valuex GROUP BY keycol

Ok. Очевидно, неправильно .. спасибо, что указали это. Сейчас я просто закончу пробуждение ... Понедельник ...

+0

Думаю, вам нужно добавить valuex в groupby в ваш пример или, возможно, добавить Coalesce к нему. Отличное объяснение кстати. –

+0

и поле COALESCE - вы не можете использовать какие-либо неагрегатные поля в GROUP BY, если они не находятся в предложении GROUP BY. – mwigdahl

+0

Этот синтаксис недействителен в SQL Server, так как вы группируете keycol, но вы не используете агрегирующую функцию, а другие столбцы – Lamak

0

Что-то вроде этого?

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 
0

Это выглядит так, как если структура данных такова, что вы всегда просто хотите не-NULL valuex строку для каждого keycol. Вы должны быть в состоянии достигнуть этого, и свернуть name1 и Имя2 вместе, путем устранения NULL valuex строк с UNION, как так:

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

Если всегда есть только один действительный valuex строка для каждого keycol, это должно работать , Если это не так, так это то, как ваши данные выложены, дайте мне знать, и я изменю дальше.

1

BTW - Три столбца справа, по сути, идентичны. Вы можете отказаться от права (значения типа «значение-а» и т. Д.) Без штрафа, а затем объединить два других.

Во всяком случае - несколько различных способов - с помощью DISTINCT или, альтернативно, GROUP BY, чтобы получить то, что вы хотите:

Использование DISTINCT:

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

Использование GROUP BY:

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