В SQL Server 2008R2: То, что я пытаюсь сделать, - это взять несколько строк из одной таблицы и сравнить их, чтобы получить максимально возможную строку. Мне нужно, чтобы поиск столбцов был динамическим, поскольку столбцы могут меняться, и доступ к скрипту, который я пишу, не будет легко изменяться, когда вы живете. Таблица содержит 277 столбцов (и подсчета голосов), но давайте попробуем упростить, что на данный момент:Динамическое сравнение всех столбцов для нескольких строк
REC FIRST LAST MIDDLE CITY STATE CTRY
1 John Doe Phoenix UNK
2 John Doe Quincy AZ
3 J Doe Phoenix AZ USA
Я хотел бы быть в состоянии выбрать строку «Мастер», для этого примера предположим, что REC 1 и где значение равно NULL, выберите значение из следующей строки, а если это значение null, следующая строка и т. д. для всех выбранных строк. BONUS если я могу не только перезаписать NULLS, но где value = 'UNK', это будет моим следующим шагом. В идеале, комбинированная запись для выше будет выглядеть как например:
REC FIRST LAST MIDDLE CITY STATE CTRY
1 John Doe Quincy Phoenix AZ USA
Я играл вокруг с КРОМЕ и различных союзов, но не сделал это очень далек из ворота, как динамический аспект это низкорослость мой прогресс.
Если не удается сделать это с помощью нескольких строк, запрашиваемом выше, я доволен по сравнению с 1 до 2, а затем сравнивая 1 до 3.
EDIT То, что я пытаюсь сделать, это динамически (и динамически, я хочу сказать, что столбцы и число записей могут отличаться от возникновения до появления) создать это:
create table #Something
(
REC int
, FIRSTName varchar(10)
, LASTName varchar(10)
, MIDDLE varchar(10)
, CITY varchar(10)
, STATE varchar(10)
, CTRY varchar(10)
)
insert #Something
select 1, 'John', 'Doe', NULL, 'Phoenix', 'UNK', null union all
select 2, 'John', 'Doe', 'Quincy', NULL, 'AZ', null union all
select 3, 'J', 'Doe', NULL, 'Phoenix', 'AZ', 'USA'
select
a.REC
,case
when nullif(a.FIRSTName, 'UNK') is not null then a.FIRSTName
when nullif(b.FIRSTName, 'UNK') is not null then b.FIRSTName
when nullif(c.FIRSTName, 'UNK') is not null then c.FIRSTName
else a.FIRSTName
end FirstName
,case
when nullif(a.LASTName, 'UNK') is not null then a.LASTName
when nullif(b.LASTName, 'UNK') is not null then b.LASTName
when nullif(c.LASTName, 'UNK') is not null then c.LASTName
else a.LASTName
end LastName
,case
when nullif(a.MIDDLE, 'UNK') is not null then a.MIDDLE
when nullif(b.MIDDLE, 'UNK') is not null then b.MIDDLE
when nullif(c.MIDDLE, 'UNK') is not null then c.MIDDLE
else a.MIDDLE
end MIDDLE
,case
when nullif(a.CITY, 'UNK') is not null then a.CITY
when nullif(b.CITY, 'UNK') is not null then b.CITY
when nullif(c.CITY, 'UNK') is not null then c.CITY
else a.CITY
end CITY
,case
when nullif(a.STATE, 'UNK') is not null then a.STATE
when nullif(b.STATE, 'UNK') is not null then b.STATE
when nullif(c.STATE, 'UNK') is not null then c.STATE
else a.STATE
end STATE
,case
when nullif(a.CTRY, 'UNK') is not null then a.CTRY
when nullif(b.CTRY, 'UNK') is not null then b.CTRY
when nullif(c.CTRY, 'UNK') is not null then c.CTRY
else a.CTRY
end CTRY
from #Something a
,#Something b
,#Something c
where a.REC = 1
and b.REC = 2
and c.REC = 3
Как вы знаете, что это все тот же человек? Я могу использовать MAX для большей части этого, но вам нечего указывать, что составляет группу. Что произойдет, если у вас есть Джейн Доу? Почему она, Джон, а не Джейн? Возможно, что ваш опубликованный пример слишком упрощен. –
Пользователь определяет, какие записи должны использоваться для объединения. Если в таблице есть Jane Doe, пользователь не выбрал Jane. Пользователь выбрал записи 1, 2 и 3 (удобно). Мне не нужна логика, обязательно, для потенциальных матчей, но что делать после того, как я сузил свои потенциальные матчи. –
ОК. Итак, откуда вы знаете, что это должен быть Джон, а не J? –