Как объединить две строки в одну строку в CTE - PullRequest
0 голосов
/ 18 декабря 2018

Я получаю данные в CTE, как это.

Здесь я получаю две записи для каждого ActivityId, чего я хочу добиться, так это создать две записи из двух строк.Из строки, где r2 = 1, мне нужны только RDate как Todate, ActualProgress как endprogress и PlannedProgress как endplannedprogress, потому что это единственные значения, которые будут изменены в обеих строках.

Я получаю эти данные в CTE.

WITH CTE as(SELECT row_number() over (partition by pmaph.ActivityId order by date) r1, row_number() over (partition by pmaph.ActivityId order by date desc) r2,pma.PlanEndDate as PlanEndDate ,pma.PlanStartDate as PlanStartDate,pmaph.ActivityId,pmaph.ProjectMilestoneActivProgHist_Id as ProMileAvtiID,umd.UOM_Name as UomName, pmm.MilestoneName as MilestoneName,pma.ActivityName as ActivityName ,pmp.ProjectName as ProjectName, Replace((rtrim(ltrim(Convert(varchar(12),Cast(pmaph.Date as Datetime),106)))),' ','-') as RDate, isnull(pmaph.Actual_Progress,0) as ActualProgress,isnull(pmaph.Planned_Progress,0) as PlannedProgress FROM ProjectMilestoneActivityProgressHistory as pmaph left join dbo.PM_Project as pmp on pmaph.ProjectId=pmp.ProjectId left join dbo.PM_Activity as pma on pmaph.ActivityId=pma.ActivityId  left join dbo.PM_Milestone  as pmm on pmaph.MilestoneId=pmm.MilestoneId left join dbo.UOMDetail as umd on pma.UOM_Id=umd.UOM_Id where pmaph.Client_Id=@ClientId
)
select  * from CTE where r1=1 or r2=1

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Может быть, это может дать вам подсказку.Обязательно сохраните формат вашего SQL.

;WITH CTE as
(
    SELECT 
        row_number() over (partition by pmaph.ActivityId order by date) r1, 
        row_number() over (partition by pmaph.ActivityId order by date desc) r2,
        pma.PlanEndDate as PlanEndDate ,
        pma.PlanStartDate as PlanStartDate,
        pmaph.ActivityId,
        pmaph.ProjectMilestoneActivProgHist_Id as ProMileAvtiID,
        umd.UOM_Name as UomName, 
        pmm.MilestoneName as MilestoneName,
        pma.ActivityName as ActivityName,
        pmp.ProjectName as ProjectName, 
        Replace((rtrim(ltrim(Convert(varchar(12),Cast(pmaph.Date as Datetime),106)))),' ','-') as RDate, 
        isnull(pmaph.Actual_Progress,0) as ActualProgress,
        isnull(pmaph.Planned_Progress,0) as PlannedProgress 
    FROM 
        ProjectMilestoneActivityProgressHistory as pmaph 
        left join dbo.PM_Project as pmp on pmaph.ProjectId=pmp.ProjectId 
        left join dbo.PM_Activity as pma on pmaph.ActivityId=pma.ActivityId  
        left join dbo.PM_Milestone  as pmm on pmaph.MilestoneId=pmm.MilestoneId 
        left join dbo.UOMDetail as umd on pma.UOM_Id=umd.UOM_Id 
    where 
        pmaph.Client_Id=@ClientId
)
SELECT
    C1.*, -- Now you have all data in one row (by Activity), select whichever columns you want
    C2.*
FROM
    CTE AS C1
    INNER JOIN CTE AS C2 ON 
        C1.ActivityId = C2.ActivityId AND
        C2.r2 = 1 -- ... and join against the other row
WHERE
    C1.r1 = 1 -- pick 1 row by Activity
0 голосов
/ 18 декабря 2018

Вы можете сделать Группировку по ActivityId, включая MAX (RDate) и MAX (ActualProgress), она должна возвращать только одну строку для ActivityId.

...