Строки данных SQL в виде столбцов - PullRequest
3 голосов
/ 18 апреля 2011

Я хочу вернуть столбцы, представляющие разных пользователей для файла 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

До сих пор я пытался использовать pivot для этого, но он поддерживает только Ints (и, следовательно, только Ids):

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

Однако мне нужно иметь возможность извлекать имена пользователей (и другие текстовые детали) из дочерних строк пользователя и добавлять их в виде столбцов для родительского элемента их поставщика.

Есть предложения по созданию этой работы?

Спасибо

1 Ответ

1 голос
/ 18 апреля 2011

Хорошо, если вы хотите получить динамическое количество столбцов, вам придется использовать динамический sql.Для этого, пожалуйста, сначала посмотрите на эту ссылку.Затем вы можете попробовать это:

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
...