SQL数据行变列

3

我希望能够返回CSV文件中代表各个用户的列,这与我们数据库的一部分有关。

基本表格如下所示:

ProviderId ProviderName
1 Test
2 FooBar

UserId UserName
1 Mike
2 Bob
3 John

ProviderId UserId
1 1
2 2
1 3

我希望结果看起来像这样:

我希望呈现的结果如下:

ProviderName UserName1 UserName2 ...
Test Mike John
FooBar Bob

到目前为止,我尝试使用透视表来实现此操作,但它只支持整数(因此仅支持ID):

SELECT ProviderId, [1],[2],[3],[4] FROM (
    SELECT p.ProviderId, u.UserId, ROW_NUMBER() OVER(PARTITION BY p.ProviderId ORDER BY p.ProviderId ASC, u.UserId ASC) as Row
        FROM Provider p
        left join ProviderUser pu on p.ProviderId=pu.ProviderId
        left join [User] u on pu.UserId = u.UserId
) as MyTable
PIVOT
(
SUM(UserId) FOR Row IN ([1],[2],[3],[4])
) as PivotTable


ProviderId  1   2   3   4
1   2   15  18  22
2   17  23  NULL    NULL

然而,我需要能够从用户子行中获取用户名(和其他文本细节),并按其提供者父级将它们作为列附加。

有什么建议可以使这项工作顺利完成吗?

谢谢。


可能是在SQL Server中使用PIVOT的重复问题。 - JNK
这里已经有大约120亿个关于PIVOT的问题了。在发新问题之前,请先查看搜索结果... - JNK
@Chris,你可能会从以下答案中得到帮助:https://dev59.com/IXM_5IYBdhLWcg3wTRLL - Lieven Keersmaekers
@lieven - 你比我更有耐心/更专注! - JNK
@JNK - 现在那可是个彻头彻尾的谎言...收回去吧... :) - Lieven Keersmaekers
显示剩余3条评论
1个回答

1

好的,如果你想要获取动态列数,那么你需要使用动态SQL。为此,请先查看this链接。然后,你可以尝试以下代码:

DECLARE @Users NVARCHAR(MAX), @Query NVARCHAR(MAX)
SET @Users = ''

SELECT @Users = @Users + '[UserName' + CAST(UserId AS VARCHAR) +'],'
FROM Users
ORDER BY UserId

SET @Users = LEFT(@Users,LEN(@Users)-1)

SET @Query = '
SELECT ProviderName, '+@Users+'
FROM (  SELECT B.ProviderName, C.UserName, ''UserName''+CAST(A.UserId AS VARCHAR) UserAlias
        FROM ProviderUsers A
        JOIN Provider B
        ON A.ProviderId = B.ProviderId
        JOIN Users C
        ON A.UserId = C.UserId) T
PIVOT(MIN(UserName) FOR UserAlias IN ('+@Users+')) AS PT'

EXEC sp_executesql @Query

顺便说一句,我并不是在寻找动态列(我需要的列和数量是已知且固定的),而是想从数据透视表中提取文本值,你的MIN(UserName)回答了我的问题。谢谢! - user358089

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接