Возможно, я предлагаю следующее решение (пожалуйста, не судите строго, это просто идея): вместо того, чтобы иметь фиктивный «Имя пользователя» в качестве имени столбца в вашей первой строке, почему бы не поставить туда настоящих имен пользователей и да/нет на перекрестке строк/столбцов для каждого пользователя/проекта. См. Рисунок ниже. Это общий вид вида в разных таблицах членства или таблицах счисления игроков (но они имеют одинаковые имена по вертикали и по горизонтали).
Я вставил членство записи тестов, так что вы видите Марк является членом во всех проектах, в то время как Брайан только в SQL.
Этот динамический SQL производит вышеуказанный вывод:
DECLARE @dynPivotSQL AS NVARCHAR(MAX)
DECLARE @pivotColNames AS NVARCHAR(MAX)
DECLARE @pivotColNamesMin AS NVARCHAR(MAX)
-- get distinct username for column headers
SELECT @pivotColNames= ISNULL(@pivotColNames + ',','')
+ QUOTENAME(UserName),
@pivotColNamesMin= ISNULL(@pivotColNamesMin + ',','')
+ 'min(' + QUOTENAME(UserName) +') as ' + QUOTENAME(UserName)
FROM (SELECT DISTINCT UserName, UserID FROM Users) AS U
SET @dynPivotSQL = N'
with cte as (
select p.ProjectName,u.UserName,IsMember=1 from ProjectsUsers pu
join Projects p on p.ProjectID = pu.FK_ProjectID
join Users u on u.UserID = pu.FK_UserID
) select ProjectName, ' + @pivotColNamesMin + ' from cte
pivot (
min(IsMember) for UserName in (' + @pivotColNames + ')
) pvt
group by ProjectName '
EXEC sp_executesql @dynPivotSQL
Примечание, так как ваше требование, чтобы иметь динамические списки проектов/пользователей я должен был использовать динамический SQL для создания динамического списка столбцов для Т- SQL PIVOT, который обычно работает с жестко закодированными/статическими значениями/именами столбцов.
Обратите внимание, что в используемом блоке используется трюк min (IsMember), потому что для pivot требуется некоторая функция агрегации, но мы не можем выполнить min (UserName), потому что оно действительно вернет минимальное имя в наборе конкретного проекта имена участников.
@pivotColNamesMin - еще один трюк, теперь для GROUP BY, потому что он не будет работать, если все возвращенные столбцы не входят в группу по списку или не находятся внутри агрегатной функции.
Я уверен, что вы можете подать предложенный источник данных в свою сетку данных, а во время некоторых событий ItemDataBound или подобных событий вы можете изменить эти «1» знаки членства на пользовательские строки или изображения с помощью «ДА» или чего-либо подобного. Но для того, чтобы это работало, ваша databrid не должна использовать жестко заданные имена столбцов и иметь возможность динамически загружать их из фактического набора результатов.
Я проверил свой запрос на SQL Server 2008 R2. Дайте мне знать, если это приемлемое решение, чтобы я мог перестать его настраивать.
НТН
https://www.tutorialspoint.com/sql/sql-using-joins.htm – Plutonix
@michael raouf У вас есть определенное число столбцов? то есть сколько максимального пользователя может иметь один проект? –
Нет Максимальное количество пользователей, которые мне нужны, чтобы быть динамичными, я думаю, что это не логика, но я пытаюсь это сделать. –