CREATE OR REPLACE VIEW public."Prj_V_ManMonthGantt" AS WITH base AS ( SELECT r."TenantId", p."BranchId", w."ProjectId", r."UserId", w."Id" AS "WorkPackageId", w."Code", w."Name", r."Rate", make_date(r."Year", r."Month", 1) AS "PeriodDate" FROM public."Prj_T_WorkPackageMonthRate" r INNER JOIN public."Prj_T_WorkPackage" w ON w."Id" = r."WorkPackageId" AND w."IsDeleted" = FALSE INNER JOIN public."Prj_T_Project" p ON p."Id" = w."ProjectId" AND p."IsDeleted" = FALSE WHERE r."IsDeleted" = FALSE AND r."Rate" > 0 ) SELECT (b."ProjectId"::text || '|' || b."UserId"::text)::varchar(120) AS "Id", NULL::varchar(120) AS "ParentId", b."TenantId", b."ProjectId", b."UserId", NULL::uuid AS "WorkPackageId", FALSE AS "IsDeleted", 1 AS "RowLevel", COALESCE(MAX(u."Name" || ' ' || u."Surname"), MAX(u."UserName"))::varchar(256) AS "Title", MIN(b."PeriodDate") AS "StartDate", (MAX(b."PeriodDate") + INTERVAL '1 month' - INTERVAL '1 day')::date AS "EndDate", AVG(b."Rate")::numeric(18,4) AS "Progress", AVG(b."Rate")::numeric(18,4) AS "AvgRate", SUM(b."Rate")::numeric(18,4) AS "TotalRate", COUNT(DISTINCT b."PeriodDate")::integer AS "MonthCount", b."BranchId" FROM base b LEFT JOIN public."AbpUsers" u ON u."Id" = b."UserId" GROUP BY b."TenantId", b."BranchId", b."ProjectId", b."UserId" UNION ALL SELECT (b."ProjectId"::text || '|' || b."UserId"::text || '|' || b."WorkPackageId"::text)::varchar(120), (b."ProjectId"::text || '|' || b."UserId"::text)::varchar(120), b."TenantId", b."ProjectId", b."UserId", b."WorkPackageId", FALSE, 2, (MAX(b."Code") || ' ' || MAX(b."Name"))::varchar(256), MIN(b."PeriodDate"), (MAX(b."PeriodDate") + INTERVAL '1 month' - INTERVAL '1 day')::date, AVG(b."Rate")::numeric(18,4), AVG(b."Rate")::numeric(18,4), SUM(b."Rate")::numeric(18,4), COUNT(DISTINCT b."PeriodDate")::integer, b."BranchId" FROM base b GROUP BY b."TenantId", b."BranchId", b."ProjectId", b."UserId", b."WorkPackageId";