SQL Server:如何将多个行值分组到单独的列中?

SQL Server:如何将多个行值分组到单独的列中?,sql,sql-server,Sql,Sql Server,我正在尝试创建一个SELECT查询,该查询允许我将联系人的多个电话号码合并到单独的列中 例如,我想要以下内容 Email | Phone | ID | ------------------------| x@x.com| 555-5555| 001 | x@x.com| 555-5556| 001 | 改为: Email | Phone | Phone2 | Phone3 | ID | ----------------------------------------

我正在尝试创建一个
SELECT
查询,该查询允许我将联系人的多个电话号码合并到单独的列中

例如,我想要以下内容

Email  |  Phone  |  ID  |
------------------------|
x@x.com| 555-5555| 001  |
x@x.com| 555-5556| 001  |
改为:

Email  |  Phone  |  Phone2  | Phone3 |  ID  |
--------------------------------------------|
x@x.com| 555-5555| 555-5556 |  NULL  | 001  |
虽然这可能是一种不好的做法,但严格来说,我可以将结果导出到CSV,以便将数据上载到CRM系统,该系统在导入时不允许任何重复。我看了所有的地方,似乎找不到一个关于电话号码的答案,因为
MIN
MAX
只允许两个,不能再多了

最复杂的部分是数据库的结构,很可能涉及复杂的查询。以下是我到目前为止尝试的内容,但只能得到2个数字,我需要剩余的列(请记住,我不是SQL高手):


以下是一种动态轴心方式:

declare @table table (Email varchar(64), Phone varchar(16), ID varchar(3))
insert into @table
values

('x@x.com','555-5555','001'),
('x@x.com','555-5556','001'),
('x@x.com','555-5557','001'),
('x@x.com','555-5558','001'),
('x@xdd.com','333-5556','002'),
('x@xdd.com','444-5556','002'),
('x@xdd.com','777-5556','002')


select
    Email
    ,Phone
    ,ID
    ,row_number() over (partition by ID order by Phone) as RN
into #staging
from 
    @table




DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)

--Get distinct values of the PIVOT Column 
SELECT @ColumnName= ISNULL(@ColumnName + ',','') 
       + QUOTENAME(RN)
FROM (SELECT DISTINCT RN FROM #staging) AS RN

--Prepare the PIVOT query using the dynamic 
SET @DynamicPivotQuery = 
  N'SELECT Email, ID, ' + @ColumnName + '
    FROM #staging
    PIVOT(MAX(Phone) 
          FOR RN IN (' + @ColumnName + ')) AS PVTTable'
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery

drop table #staging
如您所述,如果您只期望3,您可以跳过动态…

declare @table table (Email varchar(64), Phone varchar(16), ID varchar(3))
insert into @table
values

('x@x.com','555-5555','001'),
('x@x.com','555-5556','001'),
('x@xdd.com','333-5556','002'),
('x@xdd.com','444-5556','002'),
('x@xdd.com','777-5556','002')

;with cte as(
select
    Email
    ,Phone
    ,ID
    ,row_number() over (partition by ID order by Phone) as RN
from 
    @table)

select
    Email
    ,max(case when RN = 1 then Phone end) as Phone1
    ,max(case when RN = 2 then Phone end) as Phone2
    ,max(case when RN = 3 then Phone end) as Phone3
    ,ID
from
    cte
group by
    Email
    ,ID

Pivot或Dynamic Pivot取决于您期望的电话号码数量?这里可以看到类似的用法哇,你们太快了!我预计总共只有3个电话号码。我会调查的。非常感谢你跑得这么快!我完全被你这么快就想到了!只是试了一下,我想这正是我需要的。非常感谢!别担心。我还添加了一个简单的解决方案。我可以将此解决方案与联接一起使用,对吗?我现在已经使用您的代码作为模板添加了它们,我不知道什么是“cte”。我遇到了一个OutOfMemory例外。。唯一的区别是没有@table和am的声明,而是使用了我已有的列。@ZacHerman CTE是
公共表表达式
。您可以使用连接(在cte内部和外部)。我不知道你为什么会从MemoryException中得到
,但是请在你的原始问题中随意发布你的代码,这次我会看一看^没关系。。SSMS肯定出了什么问题,因为我重新启动了它,它正在工作。非常感谢。
declare @table table (Email varchar(64), Phone varchar(16), ID varchar(3))
insert into @table
values

('x@x.com','555-5555','001'),
('x@x.com','555-5556','001'),
('x@xdd.com','333-5556','002'),
('x@xdd.com','444-5556','002'),
('x@xdd.com','777-5556','002')

;with cte as(
select
    Email
    ,Phone
    ,ID
    ,row_number() over (partition by ID order by Phone) as RN
from 
    @table)

select
    Email
    ,max(case when RN = 1 then Phone end) as Phone1
    ,max(case when RN = 2 then Phone end) as Phone2
    ,max(case when RN = 3 then Phone end) as Phone3
    ,ID
from
    cte
group by
    Email
    ,ID