2013-10-09 6 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 

これは私が欲しいものです。私は、クロスが適用され、ピボットおよびアンピボットなど、多くのことを試してみた - しかし、私はこの結果を得るように見えるカント:

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

私はそれで動作することができるでしょう、私はsocial_network_idのための使用を持っていませんか、 join_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を使用しています。

解決済み私は以下のBluefeetから提供された回答を使用しましたが、それは魅力的でした。また、時間を割いてくれたチャーに感謝します。

+0

だけ**これら3つの**ネットワークまたはクエリハンドルがすべきのためにあなたのSourceTableで不要な列が含まれていません。 **「ソーシャルネットワーク」の表にある限り、それらの数字はいくつでも** 3つだけの場合、3つの '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; 

は、私はそれが非常に簡単なPIVOTケースだと思いますSQL Fiddle with Demo

+1

まず最初に、レビューに時間をかけていただき、ありがとうございました。動的な例にも感謝します。私はこれが、誰かが助けてくれることを証明してくれることを願っています。私は質問を考える上で愚かな気がするが、絶望は面白い事である。再度、感謝します。 – apoji187

1

を参照してください。あなたは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 

ヒント:PIVOT

SQL Fiddle