SQL Server 2008,我继承了这样一个表(74k行):
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
在两行之间的匹配,如果name2
为空,则使用name1
,反之亦然,但始终使用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
顺便说一句——右边的三列基本上是相同的。你可以去掉最右边的(像'value-a'之类的值),然后把其他两个组合起来。
总之——有几种不同的方法——使用DISTINCT,或者GROUP BY来得到你想要的:
使用不同的:
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
像这样?
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
可以使用COALESCE()函数。它接受任意数量的参数,并返回第一个非null值作为结果。
edit: SELECT keycol, COALESCE(name1, name2), valuex GROUP BY keycol
Ok。显然错了. .谢谢你指出来。我现在要起床了....星期一…
看起来好像数据结构是这样的,您总是只希望每个键值的非null值行。您应该能够实现这一点,并将name1和name2折叠在一起,通过使用UNION消除NULL值行,如下所示:
SELECT keycol, name1, valuex
FROM tablename
WHERE valuex != '' AND name1 != ''
UNION
SELECT keycol, name2 AS name1, valuex
FROM tablename
WHERE valuex != '' AND name2 != ''
如果每个keycol总是只有一个有效值行,这应该可以工作。如果您的数据不是这样布局的,请告诉我,我将进一步修改。