SQL Server 2008 Management Studio:将行数据转换为列

SQL Server 2008 Management Studio:将行数据转换为列,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我试过看关于这个主题的其他帖子,但我看到的所有例子都是基于知道一个特定的值 我所拥有的示例: Address Name Number ------- ------- ------- 1234 Main Bob 555-555-5555 1234 Main Karen 444-444-4444 1990 Maple Susie 333-333-3333 1010 12th Joe 222-222-222

我试过看关于这个主题的其他帖子,但我看到的所有例子都是基于知道一个特定的值

我所拥有的示例:

Address       Name     Number
-------      -------   -------
1234 Main     Bob      555-555-5555
1234 Main     Karen    444-444-4444
1990 Maple    Susie    333-333-3333
1010 12th     Joe      222-222-2222
1010 12th     Beth     111-111-1111
1010 12th     Steve    444-433-3221
我想要的示例:

Address     Contact1               Contact2              Contact3
-------      -------               --------              --------
1234 Main    Bob:555-555-5555     Karen:444-444-4444     NULL
1990 Maple   Susie:333-333-3333      NULL                NULL
1010 12th    Joe: 222-222-2222    Beth 111-111-1111    Steve 444-433-3221
有数千行,所以我无法装箱和。。我在这里迷路了


有什么建议吗?

动态轴心会起作用,但动态交叉表也会起作用。一般来说,交叉表在性能上优于枢轴。这是我几天前发布的一个例子

if OBJECT_ID('Something') is not null
    drop table Something

create table Something
(
    ID int,
    Subject1 varchar(50)
)

insert Something
select 10868952, 'NUR/3110/D507' union all
select 10868952, 'NUR/3110/D512' union all
select 10868952, 'NUR/4010/D523' union all
select 10868952, 'NUR/4010/HD20' union all
select 12345, 'asdfasdf'
declare @MaxCols int

declare @StaticPortion nvarchar(2000) = 
    'with OrderedResults as
    (
        select *, ROW_NUMBER() over(partition by ID order by Subject1) as RowNum
        from Something
    )
    select ID';

declare @DynamicPortion nvarchar(max) = '';
declare @FinalStaticPortion nvarchar(2000) = ' from OrderedResults Group by ID order by ID';

with E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS 
(
    SELECT  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)

select @DynamicPortion = @DynamicPortion + 
    ', MAX(Case when RowNum = ' + CAST(N as varchar(6)) + ' then Subject1 end) as Subject' + CAST(N as varchar(6)) + CHAR(10)
from cteTally t
where t.N <= 
(
    select top 1 Count(*)
    from Something
    group by ID
    order by COUNT(*) desc
)

select @StaticPortion + @DynamicPortion + @FinalStaticPortion

declare @SqlToExecute nvarchar(max) = @StaticPortion + @DynamicPortion + @FinalStaticPortion;
exec sp_executesql @SqlToExecute

我认为您可以使用以下查询。这假设您最多有三个联系人

;WITH orderedAddress(Address,Name,Number,Sort)
AS
(
SELECT Address,Name,Number,ROW_NUMBER() OVER(PARTITION BY Address ORDER BY Name) AS num
FROM Addresses
)
SELECT main.Address,Contact1.Name + ':' + Contact1.Number AS Contact1 ,
Contact2.Name + ':' + ISNULL(Contact2.Number,'') AS Contact2 ,
Contact3.Name + ':' + ISNULL(Contact3.Number,'') AS Contact3 
FROM
(SELECT DISTINCT Address FROM Addresses) AS main
LEFT JOIN OrderedAddress Contact1 ON main.Address = Contact1.Address AND Contact1.Sort=1
LEFT JOIN OrderedAddress Contact2 ON main.Address = Contact2.Address AND Contact2.Sort=2
LEFT JOIN OrderedAddress Contact3 ON main.Address = Contact3.Address AND Contact3.Sort=3

是的,执行搜索我看到很多用户问这样的问题将行转换为列。。。他们在写问题,而不是搜索…一般来说,交叉表在性能上会优于枢轴,您是否有任何指向资源的链接来支持该陈述?。如果你认为在这里发布你完全相同的答案是一个好答案,那么这意味着这个问题是重复的你的意思是你不会仅仅相信我的话?哈哈。这是杰夫·摩登写的一篇关于交叉标签的文章。他比较了静态和动态交叉选项卡与枢轴。交叉标签的另一大优势是能够进行多个聚合。好的,我看了这篇文章。我可以看到,这里没有统计表,也没有任何与执行动态SQL相关的内容,您在回答中添加了很多内容,这些内容中使用了什么tests@Lamak你看过这个系列的第二篇文章了吗?这就是他进入动态版本的地方。哦…里面没有第二条的链接。不,第一次真正登录sqlservercentral时,我不得不询问一位同事的用户,我甚至不知道如何在那里搜索另一篇文章,也看不清楚一个系列的链接,所以,我阅读了你链接的内容。你已经决定最多有3个联系人。Op暗示他/她需要一个动态的解决方案