在只有一个重复数据字段的情况下使用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站点。我将在将来使用它。