CREATE OR ALTER VIEW [dbo].[Prj_V_ManMonthGantt] AS WITH base AS ( SELECT r.[TenantId], w.[ProjectId], r.[UserId], w.[Id] AS [WorkPackageId], w.[Code], w.[Name], r.[Rate], DATEFROMPARTS(r.[Year], r.[Month], 1) AS [PeriodDate] FROM [dbo].[Prj_T_WorkPackageMonthRate] r INNER JOIN [dbo].[Prj_T_WorkPackage] w ON w.[Id] = r.[WorkPackageId] AND w.[IsDeleted] = 0 INNER JOIN [dbo].[Prj_T_Project] p ON p.[Id] = w.[ProjectId] AND p.[IsDeleted] = 0 WHERE r.[IsDeleted] = 0 AND r.[Rate] > 0 ) SELECT CAST(CONCAT(CAST(b.[ProjectId] AS nvarchar(36)), '|', CAST(b.[UserId] AS nvarchar(36))) AS nvarchar(120)) AS [Id], CAST(NULL AS nvarchar(120)) AS [ParentId], b.[TenantId], b.[ProjectId], b.[UserId], CAST(NULL AS uniqueidentifier) AS [WorkPackageId], CAST(0 AS bit) AS [IsDeleted], 1 AS [RowLevel], CAST(COALESCE(MAX(u.[Name] + N' ' + u.[Surname]), MAX(u.[UserName])) AS nvarchar(256)) AS [Title], MIN(b.[PeriodDate]) AS [StartDate], EOMONTH(MAX(b.[PeriodDate])) AS [EndDate], CAST(AVG(b.[Rate]) AS decimal(18, 4)) AS [Progress], CAST(AVG(b.[Rate]) AS decimal(18, 4)) AS [AvgRate], CAST(SUM(b.[Rate]) AS decimal(18, 4)) AS [TotalRate], COUNT(DISTINCT b.[PeriodDate]) AS [MonthCount] FROM base b LEFT JOIN [dbo].[AbpUsers] u ON u.[Id] = b.[UserId] GROUP BY b.[TenantId], b.[ProjectId], b.[UserId] UNION ALL SELECT CAST(CONCAT(CAST(b.[ProjectId] AS nvarchar(36)), '|', CAST(b.[UserId] AS nvarchar(36)), '|', CAST(b.[WorkPackageId] AS nvarchar(36))) AS nvarchar(120)), CAST(CONCAT(CAST(b.[ProjectId] AS nvarchar(36)), '|', CAST(b.[UserId] AS nvarchar(36))) AS nvarchar(120)), b.[TenantId], b.[ProjectId], b.[UserId], b.[WorkPackageId], CAST(0 AS bit), 2, CAST(MAX(b.[Code]) + N' ' + MAX(b.[Name]) AS nvarchar(256)), MIN(b.[PeriodDate]), EOMONTH(MAX(b.[PeriodDate])), CAST(AVG(b.[Rate]) AS decimal(18, 4)), CAST(AVG(b.[Rate]) AS decimal(18, 4)), CAST(SUM(b.[Rate]) AS decimal(18, 4)), COUNT(DISTINCT b.[PeriodDate]) FROM base b GROUP BY b.[TenantId], b.[ProjectId], b.[UserId], b.[WorkPackageId] GO