sku370870 (2/11/2016)
CREATE TABLE #tblProjects
(
ProjectID int,
Project varchar(50)
)
GO
INSERT INTO #tblProjects (ProjectID, Project)
SELECT 1, 'Project one' UNION ALL
SELECT 2, 'Project two'
----------------------------------
CREATE TABLE #tblTasks
(
TaskID int,
Task varchar(50)
)
GO
INSERT INTO #tblTasks (TaskID, Task)
SELECT 1, 'Task one' UNION ALL
SELECT 2, 'Task two' UNION ALL
SELECT 3, 'Task three' UNION ALL
SELECT 4, 'Task four'
----------------------------------
CREATE TABLE #tblRoles
(
RoleID int,
RoleName varchar(50)
)
GO
INSERT INTO #tblRoles (RoleID, RoleName)
SELECT 1, 'Project Manager' UNION ALL
SELECT 2, 'Administrator' UNION ALL
SELECT 3, 'Coordinator'
----------------------------------
CREATE TABLE #tblUsers
(
UserID int,
UserName varchar(50)
)
GO
INSERT INTO #tblUsers (UserID, UserName)
SELECT 1, 'Fred' UNION ALL
SELECT 2, 'Barney' UNION ALL
SELECT 3, 'Betty'
----------------------------------
CREATE TABLE #tblTaskRoles
(
TaskRoleID int,
TaskID int,
RoleID int
)
GO
INSERT INTO #tblTaskRoles (TaskRoleID, TaskID, RoleID)
SELECT 1, 1, 1 UNION ALL
SELECT 2, 1, 2 UNION ALL
SELECT 3, 2, 2 UNION ALL
SELECT 4, 2, 3 UNION ALL
SELECT 5, 3, 1 UNION ALL
SELECT 6, 4, 3
----------------------------------
CREATE TABLE #tblProjectsTasks
(
ProjectTaskID int,
ProjectID int,
TaskID int,
)
GO
INSERT INTO #tblProjectsTasks (ProjectTaskID, ProjectID, TaskID)
SELECT 1, 1, 1 UNION ALL
SELECT 2, 1, 2 UNION ALL
SELECT 3, 1, 3 UNION ALL
SELECT 4, 1, 4 UNION ALL
SELECT 5, 2, 1 UNION ALL
SELECT 6, 2, 2 UNION ALL
SELECT 7, 2, 3 UNION ALL
SELECT 8, 2, 4
----------------------------------
CREATE TABLE #tblProjectsRoleUsers --this is who is assigned to which role on this project
(
ProjectRoleUserID int,
ProjectID int,
RoleID int,
UserID int
)
INSERT INTO #tblProjectsRoleUsers(ProjectRoleUserID, ProjectID, RoleID, UserID)
SELECT 1, 1, 1, 1 UNION ALL
SELECT 2, 1, 1, 2 UNION ALL
SELECT 3, 1, 2, 1 UNION ALL
SELECT 4, 1, 2, 3 UNION ALL
SELECT 5, 1, 3, 2 UNION ALL
SELECT 6, 1, 3, 3
SELECT Project, Task, RoleName, UserName FROM #tblProjects
INNER JOIN #tblProjectsTasks ON #tblProjects.ProjectID = #tblProjectsTasks.ProjectID
INNER JOIN #tblTasks ON #tblProjectsTasks.TaskID = #tblTasks.TaskID
INNER JOIN #tblTaskRoles ON #tblTasks.TaskID = #tblTaskRoles.TaskID
INNER JOIN #tblRoles ON #tblTaskRoles.RoleID = #tblRoles.RoleID
INNER JOIN #tblProjectsRoleUsers ON #tblProjects.ProjectID = #tblProjectsRoleUsers.ProjectID AND #tblRoles.RoleID = #tblProjectsRoleUsers.RoleID
INNER JOIN #tblUsers ON #tblProjectsRoleUsers.UserID = #tblUsers.UserID
ORDER BY Project, Task, RoleName, UserName
DROP TABLE #tblProjects
DROP TABLE #tblTasks
DROP TABLE #tblRoles
DROP TABLE #tblUsers
DROP TABLE #tblTaskRoles
DROP TABLE #tblProjectsTasks
DROP TABLE #tblProjectsRoleUsers
A list of projects, tasks, roles and users. Any project can have any task. Any task can have one or more roles assigned to it. On a project, any user can be assigned to any role. The data above displays as a list of tasks on a project, which roles have to do the task and which users are assigned to the role on that project.
But, I need to get the data displayed in a sort of report form - so that all the info about a task is on one line. Using | as a column separator and a tilde to show where I need to return a html return ... the first couple of lines I need to return would be:
Project one | Task four | Coordinator (Barney, Betty)
Project one | Task one | Administrator (Betty, Fred) ~ Project Manager (Barney, Fred)
I already do something similar - but using UDFs (with coalesce to concatenate values) to return the roles for each task - and likewise for the users for each task (but you can't connect the user to the role). At the moment I can return ...
Project one | Task four | Coordinator | Barney, Betty
Project one | Task one | Administrator, Project Manager | Betty, Fred, Barney, Fred
I can achieve what I need doing something awful like putting a cursor into my UDFS - looping through the roles and building a string with the users for each role etc.
Just wondered if anyone on here can tell me how to do this without a cursor in the UDFS that currently use coalesce to return the roles and users for each task.
If you install the SQLCLR Aggregates from http://groupconcat.codeplex.com you can then do something like this:
WITH cte
AS (
SELECT Project + ' | ' + Task + ' | ' AS prefix,
RoleName + ' (' + dbo.GROUP_CONCAT(UserName) + ')' AS role_users
FROM #tblProjects
INNER JOIN #tblProjectsTasks ON #tblProjects.ProjectID = #tblProjectsTasks.ProjectID
INNER JOIN #tblTasks ON #tblProjectsTasks.TaskID = #tblTasks.TaskID
INNER JOIN #tblTaskRoles ON #tblTasks.TaskID = #tblTaskRoles.TaskID
INNER JOIN #tblRoles ON #tblTaskRoles.RoleID = #tblRoles.RoleID
INNER JOIN #tblProjectsRoleUsers ON #tblProjects.ProjectID = #tblProjectsRoleUsers.ProjectID
AND #tblRoles.RoleID = #tblProjectsRoleUsers.RoleID
INNER JOIN #tblUsers ON #tblProjectsRoleUsers.UserID = #tblUsers.UserID
GROUP BY Project,
Task,
RoleName
)
SELECT cte.prefix + dbo.GROUP_CONCAT_D(cte.role_users, ' ~ ') AS roles_users
FROM cte
GROUP BY cte.prefix
ORDER BY cte.prefix;
To get this result:
There are no special teachers of virtue, because virtue is taught by the whole community.
--Plato