2011-07-25 88 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 

我需要做像這樣(脫複製和基於在使用name1如果name2keycol兩行之間的匹配,並在摺疊中的數據,是空的,並且反之亦然但總是用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值作爲結果。

編輯: SELECT KEYCOL,COALESCE(1,名稱),valuex GROUP BY KEYCOL

確定。顯然錯了..謝謝指出。我剛剛完成醒來.... mondays ...

+0

我認爲您需要在您的示例中向groupby添加valuex,或者可能向其添加Coalesce。很好的解釋btw。 –

+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

看起來好像數據結構就是這樣,你永遠只是希望每個KEYCOL非NULL valuex行。你應該能夠做到這一點,和摺疊NAME 1和NAME在一起,通過消除與UNION像這樣的空valuex行:

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

如果總有一款適合每個KEYCOL只是一個有效的valuex行,這應該工作。如果情況並非如此,那麼請告訴我,我會進一步修改。

1

順便說一句 - 右邊的3列基本上是相同的。您可以放棄最右邊的值(如'value-a'等值),然後再合併其他兩個值。

反正 - 一對夫婦不同的方式 - 使用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