2013-10-09 59 views
6

所以,我做了很多搜索和擺弄,找不到解決方案。也許我的情況是獨一無二的 - 或者更可能是我不知道我在做什麼。我比我開始的時候更加接近,所以這是令人振奮的。無論如何 - 在這裏,我們去信任,任何援助是非常感謝。SQL Join/Pivot/Unpivot = Madness

我需要加入看起來像這樣2個查找表(沒有足夠的代表處點尚未發表圖片所以這裏是我假裝表):

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 

這就是我想要的。我已經嘗試了很多事情,包括樞軸和unpivots,跨應用 - 但我似乎無法得到這樣的結果:

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

我將能夠與工作,我有沒有用的social_network_id或加入後的calling_string。這是我的查詢,這不是很好的工作。

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 

我能說的最好的是交叉應用真的沒有做任何事情。我猜那裏的語法......你能告訴嗎?

這是我得到什麼(從我一直在搜索中已經看到有些典型值):

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

是我想甚至可能嗎?任何關於如何到達那裏的指針?我的查詢是否都被擡高了?

在此先感謝女士們和男士們。

我忘記提到這一點,但我使用SQL Server 2012 - SSMS。

RESOLVED我用下面的Bluefeet提供的答案,它的工作就像一個魅力。還要感謝Cha花時間提供幫助。

+0

只是**這三個**網絡還是應該查詢手柄**只要他們在「社交網絡」表中的任何數字**?如果只有三個,你應該能夠用三個CASE WHEN結構逃脫。 –

+0

您正在使用哪種RDMS? –

+0

交叉應用是MSSQL,我認爲。 @ apoji187 +1爲偉大的第一篇文章,很好地與表格創建和選擇語句提供...非常明顯,你試圖解決自己。將來,請記住在標籤中添加您正在使用的數據庫,以便人們知道您使用的是什麼sql。跨應用/交叉連接語法在不同數據庫中是非常獨特的。 – Twelfth

回答

3

您當前的查詢非常接近。如果上面的表格是正確的結構,那麼看起來您並不需要使用CROSS APPLY,因爲您沒有任何需要未知的內容。

如果刪除CROSS應用,那麼你就可以很容易地使用PIVOT得到的結果:

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

如果你有一個未知的數值,那麼你可以使用動態SQL:

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

首先感謝您抽出寶貴時間審閱並創建小提琴。還要感謝這個動態的例子。我希望這一切都能證明對其他人的幫助。我對思考問題感到無聊,但絕望是一件有趣的事情。再次感謝。 – apoji187

1

我認爲這是一個非常簡單的PIVOT情況。你根本不需要用CROSS APPLY/JOIN來複雜化它。這樣簡單的查詢就可以了:

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 

一個提示:不要在你的sourceTable會不必要列PIVOT

SQL Fiddle