2013-07-29 11 views
1

Я пытаюсь получить SUM из 2 или более полей TIME в моей таблице PIVOT, однако, поскольку SUM не работает с символами (конвертируется так, что я могу показать EstimatedTime/ActualTime) m с трудом.SQL SUM в PIVOT, который использует MAX

Код ниже -

DECLARE @cols AS NVARCHAR(MAX); 
DECLARE @query AS NVARCHAR(MAX); 

select @cols = STUFF((SELECT distinct ',' + ID + ',' + QUOTENAME(Name) 
        FROM JobPhases 
        FOR XML PATH(''), TYPE 
       ).value('.', 'NVARCHAR(MAX)') 
        , 1, 1, ''); 

SELECT @query = 'SELECT * FROM  
( 
    SELECT j.JobID, c.Registration as ''Reg.'', p.Name, 
    CAST(MAX(j.EstimatedTime) as VARCHAR(MAX)) + ''/'' + 
    CAST(MAX(j.ActualTime) as VARCHAR(MAX)) as [x] 
    FROM JobDetails AS j 
    INNER JOIN JobPhases p ON p.ID = j.PhaseId 
    INNER JOIN Jobs job on job.ID = j.JobID 
    INNER JOIN Cars c on job.CarID = c.ID 
    WHERE (job.Status = 1 or job.Status = 0) 
    GROUP BY c.Registration, p.Name, j.JobID 
) JobDetails 
PIVOT 
( MAX(x) 
    FOR Name IN (' + @cols + ') 
) pvt' 

execute(@query); 

Формирует -

JobID | Reg.  | P13$ | Repair and Reshape    | P15$ | Refit Stripped Parts 
1065 | BJ11 2VT | NULL | 01:00:00.0000000/01:54:10.5387526 | NULL | NULL 

Таблицы -

**JobDetails** 
ID - PK Auto increment 
JobID - Int (Joined to Jobs table) 
PhaseID - String (joined to JobPhases table) 
EstimatedTime - time(7) 
ActualTime time(7) 

**JobPhases**** 
ID - PK String 
Name - VarChar(150) 

Проблема в этом примере есть 2 JobDetails для JobID 1065 -

ID | JobID | PhaseID | EstimatedTime | ActualTime 
25 | 1065 | P13$ | 01:00:00.0000000 | 01:54:10.5387526 
26 | 1065 | P13$ | 00:30:00.0000000 | 00:00:00.0000000 

Итак, правильный результат должен быть (Обратите внимание на 1:30 в ремонте & перекроить) -

JobID | Reg.  | P13$ | Repair and Reshape    | P15$ | Refit Stripped Parts 
1065 | BJ11 2VT | NULL | 01:30:00.0000000/01:54:10.5387526 | NULL | NULL 

Любые идеи, как я могу получить полную EstimatedTime для всех строк для каждой фазы ид?

Спасибо!

+0

Повороты не моя сильная сторона, но не изменяя 'CAST (MAX (j.EstimatedTime), как VARCHAR (MAX)) + '/' '+ 'на' CAST (SUM (j.EstimatedTime) как VARCHAR (MAX)) +' '/' '+ 'работать? –

+0

Это не работает, потому что SUM не может использоваться с varchar. Хорошая попытка, хотя :) – dynamicuser

+0

Оценочное время является десятичной в соответствии с вашей схемой ...? –

ответ

1

Подсчет колонн TIME не является прямым, вам нужно переписать свою линию;

CAST(MAX(j.EstimatedTime) as VARCHAR(MAX)) + ''/'' + 

к чему-то вроде (непроверенная)

CAST(CAST(DATEADD(ms, SUM(DATEDIFF(ms, '0:00:00', j.EstimatedTime)), 
       '00:00:00') AS TIME) AS VARCHAR(MAX)) + ''/'' +