6

所以,我已经做了很多搜索和摆弄,但找不到解决方案。也许我的情况是独一无二的——或者更有可能我只是不知道我在做什么。我比刚开始时更接近了,所以这令人振奋。无论如何-我们在这里进行智囊团-非常感谢任何帮助。

我需要加入 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 或 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。

已解决我使用了下面Bluefeet提供的答案,它就像一个魅力。还要感谢 Cha 抽出时间提供帮助。

4

2 回答 2

3

您当前的查询非常接近。如果您上面的表格是正确的结构,那么您似乎不需要使用CROSS APPLY,因为您没有任何需要取消透视的内容。

如果您删除 CROSS APPLY,那么您可以使用 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

于 2013-10-10T00:48:36.433 回答
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小提琴

于 2013-10-10T00:54:12.353 回答