2016-03-28 3 views
1

В 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 
+1

Как вы знаете, что это все тот же человек? Я могу использовать MAX для большей части этого, но вам нечего указывать, что составляет группу. Что произойдет, если у вас есть Джейн Доу? Почему она, Джон, а не Джейн? Возможно, что ваш опубликованный пример слишком упрощен. –

+0

Пользователь определяет, какие записи должны использоваться для объединения. Если в таблице есть Jane Doe, пользователь не выбрал Jane. Пользователь выбрал записи 1, 2 и 3 (удобно). Мне не нужна логика, обязательно, для потенциальных матчей, но что делать после того, как я сузил свои потенциальные матчи. –

+0

ОК. Итак, откуда вы знаете, что это должен быть Джон, а не J? –

ответ

0

Вы, кажется, есть несколько не хватает бизнес-правила, но вот пример, который должен в наименьшая точка в правильном направлении.

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 1 
    , MAX(nullif(FIRSTName, 'UNK')) as FirstName 
    , MAX(nullif(LASTName, 'UNK')) as LastName 
    , MAX(nullif(MIDDLE, 'UNK')) as Middle 
    , MAX(nullif(CITY, 'UNK')) as City 
    , MAX(nullif(STATE, 'UNK')) as [State] 
    , MAX(nullif(CTRY, 'UNK')) as Country 
from #Something 
+0

hmmm ... это не позволяет мне добавить редактирование к моему оригиналу. Вышеупомянутое не решает динамической части этой проблемы. Используя населенную таблицу из вашего примера, запрос должен был бы быть динамической версии ... выберите a.REC , случай, когда NULLIF (a.FIRSTName «УНК») не равно нулю, то a.FIRSTName когда NULLIF (b.FIRSTName 'УНК') не равно нулю, то b.FIRSTName когда NULLIF (c.FIRSTName 'УНК') не равно нулю, то c.FIRSTName еще a.FIRSTName конец FName ... из #Что-то a, #Что-то b, #Что-то c где a.REC = 1 и b.REC = 2 и c.REC = 3 –

+0

он должен быть динамическим в столбцах и числом таблиц, но –

+0

Ну, бит о неизвестном количестве столбцов отсутствовал в вашем вопросе, когда я отправляю сообщение это. –

0

что-то, чтобы вы начали.

объявить

@x VARCHAR (2) = '1', @ SQL VARCHAR (макс)

< в то время как @x (выбрать максимум (ЗАП) от #Something)

начать set @sql = isnull (@sql, '') + 'left join #Что-то x' + @x + 'на a.REC = x' + @x + '. REC -' + @x

set @ x = @x +1 конец

набор @sql =»выберите * из #Something а '+ @sql +', где a.REC = 1'

Exec (@sql)

+0

Хорошо, у меня есть это добавление к запросу, что очень круто, чтобы превратить несколько строк в дополнительные столбцы в одну строку. Существуют ли ограничения на количество столбцов, с которыми это будет работать? Я все еще не уверен, как я могу реализовать isnull за столбец по сравнению с другими столбцами с тем же именем. Я также пробовал несколько новых вещей сегодня, но я думаю, что это может пригодиться, просто не уверен, что он будет работать для моих нужд. Спасибо. –

Смежные вопросы