在只有一个重复数据字段的情况下使用SQL pivot

在只有一个重复数据字段的情况下使用SQL pivot,sql,Sql,我有一张像这样的桌子 owner owner_email customer dude1 email1 customer1 dude1 email1 customer2 dude1 email1 customer3 dude2 email2 customer4 dude2 email2 customer5 等等 我正在寻找以下信息 owner

我有一张像这样的桌子

owner     owner_email     customer
dude1     email1          customer1
dude1     email1          customer2
dude1     email1          customer3
dude2     email2          customer4
dude2     email2          customer5
等等

我正在寻找以下信息

owner     owner_email     customer1     customer2     customer3 etc
使用这个站点上的pivots示例,我开始发现我需要其他东西来分组,而我没有这些。在这里使用pivot是正确的解决方案吗?通过使用另一个示例,我得到了以下内容

SELECT * FROM 
(
SELECT [owner], [owner_email], [customer]
FROM tTableName
) AS source
PIVOT
(
    MAX([customer])
    FOR [customer] IN ([name1][name2][name3][name4][name5])
) as pvt

谢谢

为此,您需要考虑将
行编号()添加到内部查询中。我正在使用
行编号
名称
创建列
name1
name2
,等等。然后在应用透视功能时,您将在单独的列中返回每个所有者的客户:

SELECT * 
FROM 
(
  SELECT [owner], [owner_email], [customer],
    'Name'+cast(row_number() over(partition by owner
                                  order by customer) as varchar(50)) name
  FROM tTableName
) AS source
PIVOT
(
    MAX([customer])
    FOR [name] IN ([name1],[name2],[name3],[name4],[name5])
) as pvt;

如果每个所有者的名称超过5个,则可以使用动态SQL:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' 
                        + QUOTENAME('Name'+cast(row_number() over(partition by owner
                                                order by customer) as varchar(50))) 
                    from tTableName
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT  [owner], [owner_email],' + @cols + ' 
            from 
            (
              SELECT [owner], [owner_email], [customer],
                ''Name''+cast(row_number() over(partition by owner
                                              order by customer) as varchar(50)) name
              FROM tTableName
            ) x
            pivot 
            (
                max(customer)
                for name in (' + @cols + ')
            ) p '

execute(@query);
看。这将产生一个结果:

| OWNER | OWNER_EMAIL |     NAME1 |     NAME2 |     NAME3 |  NAME4 |  NAME5 |
-----------------------------------------------------------------------------
| dude1 |      email1 | customer1 | customer2 | customer3 | (null) | (null) |
| dude2 |      email2 | customer4 | customer5 |    (null) | (null) | (null) |

为此,您需要考虑将
行编号()添加到内部查询中。我正在使用
行编号
名称
创建列
name1
name2
,等等。然后在应用透视功能时,您将在单独的列中返回每个所有者的客户:

SELECT * 
FROM 
(
  SELECT [owner], [owner_email], [customer],
    'Name'+cast(row_number() over(partition by owner
                                  order by customer) as varchar(50)) name
  FROM tTableName
) AS source
PIVOT
(
    MAX([customer])
    FOR [name] IN ([name1],[name2],[name3],[name4],[name5])
) as pvt;

如果每个所有者的名称超过5个,则可以使用动态SQL:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' 
                        + QUOTENAME('Name'+cast(row_number() over(partition by owner
                                                order by customer) as varchar(50))) 
                    from tTableName
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT  [owner], [owner_email],' + @cols + ' 
            from 
            (
              SELECT [owner], [owner_email], [customer],
                ''Name''+cast(row_number() over(partition by owner
                                              order by customer) as varchar(50)) name
              FROM tTableName
            ) x
            pivot 
            (
                max(customer)
                for name in (' + @cols + ')
            ) p '

execute(@query);
看。这将产生一个结果:

| OWNER | OWNER_EMAIL |     NAME1 |     NAME2 |     NAME3 |  NAME4 |  NAME5 |
-----------------------------------------------------------------------------
| dude1 |      email1 | customer1 | customer2 | customer3 | (null) | (null) |
| dude2 |      email2 | customer4 | customer5 |    (null) | (null) | (null) |

SQL查询产生固定数量的列,列的名称和数据类型也是固定的。如果要生成具有可变列数的结果集,可以研究动态SQL,但通常最好使用不同的语言或更接近用户的语言执行此类转换。SQL查询生成固定数量的列,其名称和数据类型也是固定的。如果您想生成具有可变列数的结果集,可以研究动态SQL,但通常最好使用不同的语言/更接近用户的语言执行此类转换。谢谢!成功了!还感谢您链接SQLFiddle站点。我以后会用的。谢谢你的蓝脚!成功了!还感谢您链接SQLFiddle站点。我将在将来使用它。