2013-10-09 25 views
6

Çok fazla arama yaptım ve işe yaramazdım ve bir çözüm bulamıyorum. Belki de durumum eşsizdir - ya da büyük olasılıkla ne yaptığımı bilmiyorum. Başladığımdan çok daha yakınım, bu da canlandırıcı. Her neyse - biz burada braintrust gidiyoruz - herhangi bir yardım çok takdir edilmektedir.SQL Katıl/Pivot/Unpivot = Delilik

I (burada benim hayali tablolar yüzden resimleri yayınlamak için henüz yeterli değildir temsilcisi noktaları) şuna benzer 2 arama tabloları katılması gerekir:

Social Network Member [table] 
member_id  social_network_id  connection_id_string 
16972   1      www.linkedin.com/somename 
16972   2      www.twitter.com/somename 
16972   3      www.facebook.com/somename 
180301  1      www.linkedin.com/anothername 

Social Network [table] 
social_network_id  name  calling_string 
1      Linkedin www.linkedin.com 
2      Twitter www.twitter.com 
3      Facebook www.facebook.com 

Bu benim istediğim şey. Ben pivotlar ve unpivots, haç da dahil şeylerin bir dizi denedik uygulamak ettik - ama bu sonucu elde edebilirim gibi görünüyor:

member_id linkedin      facebook      twitter 
16972  www.linkedin.com/somename www.facebook.com/somename www.twitter.com/somename 

Bunun çalışmak mümkün olacak, ben social_network_id ihtiyacımız yok ya katılmadan sonra call_string. İşte benim işim oldukça işini yapmıyor.

SELECT member_id, [facebook],[linkedin],[myspace],[twitter] 
FROM (
SELECT member_id,name,social_network_id,calling_string,connection_id_string 
FROM social_network_member INNER JOIN 
social_network ON social_network_member.social_network_id = social_network.social_network_id 
CROSS APPLY (VALUES ('NAME',name), 
('CONNECTION STRING', connection_id_string), 
('CALLING STRING',calling_string)) 
Unpivoted(club_id,member_id)) as Sourcetable 
Pivot (MAX(connection_id_string) For name in([facebook],[linkedin],[myspace],[twitter])) AS PVT 

anlarım iyi çapraz gerçekten bir şey yapmıyor geçerlidir olduğunu. Oradaki sözdizimini tahmin ettim .. anlatabilir misin?

Bu (Ben aramalarda görüştüğüm kadarıyla biraz tipik) alıyorum budur:

member_id  facebook     linkedin     myspace  twitter 
16972   NULL      www.linkedin.com/somename NULL  NULL 
16972   www.facebook.com/somename NULL      NULL  NULL 
... 
... 

Hatta mümkün istediğin? Oraya nasıl gidilir? Sorgum tamamlandı mı?

Şimdiden teşekkürler Ladies and Gents.

Daha önce bahsetmeyi unuttum, ancak SQL Server 2012 - SSMS kullanıyorum.

ÇÖZÜM Aşağıdaki Bluefeet tarafından sağlanan yanıtı kullandım ve bir cazibe gibi çalıştı. Ayrıca yardım için zaman ayırdığınız için Cha sayesinde.

+0

Hemen ** Bu üç ** ağlar veya sorgu kolu gerektiği bu kadar basit sorgu yapacak ** Sosyal Ağ 'tablosunda oldukları sürece herhangi bir sayı **? Eğer sadece üç ise, üç 'CASE WHEN' yapısını kurtarabilmelisiniz. –

+0

Hangi RDMS'yi kullanıyorsunuz? –

+0

Çapraz Uygulamanın sadece MSSQL olduğunu düşünüyorum. @ apoji187 +1 büyük ilk yazı için, tablo ile iyi tanımlanmış ve verilen ifadeyi kullanarak ... kendiniz çözmeye çalıştığınız çok açık. Gelecekte, çalışmakta olduğunuz veritabanını etiketlere eklemeyi unutmayın, böylece insanlar hangi sql kullandığınızı bilirler ... çapraz başvuru/çapraz katıl sözdizimi farklı veritabanlarında benzersizdir. – Twelfth

cevap

3

Geçerli sorgunuz gerçekten yakın. Yukarıdaki tablolarınız doğru yapı ise, o zaman unpivoted gereken bir şey yok çünkü CROSS APPLY kullanmanız gerektiği görünmüyor.

Eğer ÇAPRAZ GEÇERLİ kaldırırsanız

, o zaman kolayca PIVOT kullanarak sonucu alabilirsiniz:

SELECT member_id, [facebook],[linkedin],[myspace],[twitter] 
FROM 
(
    SELECT m.member_id, 
    n.name, 
    m.connection_id_string 
    FROM social_network_member m 
    INNER JOIN social_network n 
    ON m.social_network_id = n.social_network_id 
) d 
pivot 
(
    max(connection_id_string) 
    for name in ([facebook],[linkedin],[myspace],[twitter]) 
) piv; 

SQL Fiddle with Demo bakınız. Eğer değerler bilinmeyen numarası varsa

, o zaman dinamik SQL kullanabilirsiniz:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(name) 
        from social_network 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT member_id, ' + @cols + ' 
      from 
      (
       SELECT m.member_id, 
       n.name, 
       m.connection_id_string 
       FROM social_network_member m 
       INNER JOIN social_network n 
       ON m.social_network_id = n.social_network_id 
      ) x 
      pivot 
      (
       max(connection_id_string) 
       for name in (' + @cols + ') 
      ) p ' 

execute sp_executesql @query; 

SQL Fiddle with Demo

+1

İlk ve en önemlisi, gözden geçirme zamanını ayırdığınız ve kemanı oluşturduğunuz için teşekkür ederiz. Dinamik örnek için de teşekkürler. Umarım tüm bunlar, birilerinin çizgiye düşmesine yardımcı olur. Sorguyu düşünmek için aptalca hissediyorum, ama çaresizlik komik bir şey. Tekrar teşekkürler. – apoji187

1

Bkz Ben çok basit bir MİL durum olduğunu düşünüyorum. CROSS UYGULAMA/JOIN şeyler ile karmaşıklaştırmanız gerekmez.

SELECT member_id, [facebook],[linkedin],[myspace],[twitter] 
FROM (
SELECT member_id,name,connection_id_string 
FROM social_network_member snm INNER JOIN 
social_network sn ON snm.social_network_id = sn.social_network_id 
) as Sourcetable 
Pivot (MAX(connection_id_string) For [name] in([facebook],[linkedin],[myspace],[twitter])) AS PVT 

Bir ipucu: PIVOT için SourceTable gereksiz sütunları içermez

SQL Fiddle