2016-03-28 25 views
1

SQL Server 2008R2'de: Yapmaya çalıştığım şey, aynı tablonun birden çok satırını almak ve mümkün olan en tam satırla gelmek için bunları karşılaştırmaktır. Sütunların değişebileceği ve yazdığım senaryoya erişebildiğim için dinamik olması için sütun aramasına ihtiyacım var, canlı yayında kolayca değiştirilemez. tablo 277 sütunları (ve sayma) vardır, ama şimdilik o basitleştirmek çalışalım:Birden çok satır için tüm sütunların dinamik karşılaştırması

REC FIRST LAST MIDDLE CITY  STATE CTRY 
1 John Doe    Phoenix UNK   
2 John Doe Quincy    AZ 
3 J  Doe    Phoenix AZ  USA 
Bu örneğin, bir "ana" satırını seçmek mümkün olmak istiyorum

en REC 1 varsayalım ve nerede değer NULL, sonraki satırdaki değeri seçin ve bu seçili satırlar için null, sonraki satır vb. BONUS Sadece NULLS'lerin üzerine yazamaz, ancak bir sonraki adımın değeri olan 'UNK' ise. İdeal olarak, yukarıda için kombine rekoru gibi görünür:

REC FIRST LAST MIDDLE CITY  STATE CTRY 
1 John Doe Quincy Phoenix AZ  USA 

Ben HARİÇ ve çeşitli BİRLİKLERİ etrafında çeviriyorlardı, ancak bu dinamik yönü bodurluk gibi kapıların dışarı çok uzak yapılmış değil benim ilerlemem.

yukarıda istendiği gibi birden çok satır ile bunu yapmak mümkün değilse, ben 2'ye 1 karşılaştırılması ve akabinde 1

3. için EDIT Ne yapmaya çalışıyorum olduğunu karşılaştırarak memnunum dinamik (ve dinamik, ben kayıtlarının sütunları ve sayı oluşumuna meydana gelen değişebileceğini demek) bu oluşturun:

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

nasıl anlarsınız bu hepsi aynı kişi olduğunu? Bunun için MAX kullanarak görebiliyorum ama bir grubun ne olduğunu gösteren hiçbir şey yok. Jane Doe’niz varsa ne olur? Neden John ve Jane değil? Belki de gönderdiğiniz örnek çok basitleştirilmiş. –

+0

Kullanıcı, birleştirmek için hangi kayıtların kullanılacağını belirler. Masanın bir Jane Doe varsa, kullanıcı Jane'i seçmedi. Kullanıcı 1, 2 ve 3 (uygun) kayıtlarını seçmiştir. Muhtemelen olası maçlar için mantığa ihtiyacım yok, fakat potansiyel maçlarımı daralttıktan sonra ne yapmalıyım? –

+0

Tamam. Öyleyse John'un nasıl olmalı ve J değil mi? –

cevap

0

birkaç burada iş kurallarını eksik ama var gibi gerektiği bir örnek yer almaktadır en azından sizi doğru yöne yönlendirin.

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 ... orijinalime bir düzenleme eklememe izin vermiyor. Yukarıdakiler bu sorunun dinamik kısmını gerçekten çözmez. NULLIF (a.FIRSTName, 'UNK') değilken sizin örnekten nüfuslu tabloyu kullanarak, sorgu ... dinamik versiyonu seçmek a.REC , vaka olması gerekir boş sonra a.FIRSTName NULLIF (c.FIRSTName, 'UNK') daha sonra c.FIRSTName başka a.FIRSTName uç FName ... boş değilken NULLIF (b.FIRSTName, 'UNK') daha sonra b.FIRSTName boş değilken #Something a, #Something b, #Something c Burada a.REC = 1 ve b.REC = 2 ve c.REC = 3 –

+0

, sütunlarda ve –

+0

olsa da tabloların sayısında dinamik olması gerekir. Gönderdiğimde sorunda bilinmeyen sayıda sütun eksikti bunu yaz. –

0

şey başlamak için.

beyan

@x varchar (2) SQL varchar (max)

ise @x < (maks #Something dan (REC) seçilir)

başlar @ = '1' , set @sql = isnull (@sql, '') + 'left join #Something x' + @x + 'on a.REC = x' + @x + '. REC -' + @x

set @ x = @ x + 1 sonu

set @ sql =' #Something seçin * bir '+ @ sql +' nerede a.REC = 1'

exec (@ sql)

+0

Pekala, bu sorguya ekledim, ki bu da birden çok satırı tek satırda ek sütunlara dönüştürmek için çok güzel. Bununla birlikte çalışacak sütun sayısıyla ilgili sınırlamalar var mı? Hala aynı adın diğer sütunlarına kıyasla sütun başına bir isnull'u nasıl uygulayacağımı hala bilmiyorum. Bugün de birkaç yeni şey deniyorum, ama bunun kullanışlı olabileceğini düşünüyorum, ihtiyaçlarım için çalışıp çalışmadığından emin değilim. Teşekkür ederim. –

İlgili konular