0

У меня есть отчет SSRS, который, когда я пытаюсь вычислить предыдущее значение, первая строка всегда дает неправильное значение, поскольку для его вычисления не существует предыдущего номера.SSRS 2005 Предыдущая сумма даты и времени

=CDec(format(DateDiff("s",previous(Fields!SyncDate.Value),Fields!Date.Value)/60,"0.00")) 

Значение первой строки выходит +1059831848,62 Есть ли способ, чтобы сказать ему, чтобы пропустить первую строку? Потому что также мне нужно суммировать все это, чтобы получить общее количество, которое рассчитывает первую строку и дает огромное количество.

Мой запрос состоит из следующих действий:

SELECT ToppingCount, DriverName, COUNT(Pizza) AS Count, Date, SyncDate, BranchName, Branch 
FROM System 
WHERE  (Date BETWEEN @datefrom AND @DateTo) AND (Branch IN (@branch)) AND (SystemSource = 'newsys') AND (SystemSource <> 'oldsys') 
GROUP BY Pizza, ToppingCount, DriverName, Date, SyncDate, BranchName, Branch 
ORDER BY Branch, DriverName, Date 

Благодаря

+0

Комбинация 'IIF() и' isNothing() 'возможно? Или создать фиктивную первую строку в вашем запросе и объединить с существующим выбором? –

+0

не совсем уверен, как это сделать –

ответ

0

Вы можете проверить значение предыдущего поля даты синхронизации и вывода 0 или пустым, если требуется.

=CDec(iif(IsNothing(previous(Fields!SyncDate.Value)), 0.0, format(DateDiff("s",previous(Fields!SyncDate.Value),Fields!Date.Value)/60,"0.00"))) 

Без row_number вы можете использовать внешний применить, чтобы получить последнюю дату синхронизации в запросе и предварительно вычислить «синхронизацию дельты»:

SELECT 
    p.ToppingCount, 
    p.DriverName, 
    p.Date, 
    p.SyncDate, 
    CASE 
     WHEN i.SynchDate IS NULL THEN 0.0 
     ELSE DATEDIFF(SS, l.SyncDate, p.Date)/60.0 
    END AS SyncTimeDelta, 
    p.BranchName, 
    p.Branch, 
    COUNT(p.Pizza) AS Count 
FROM System p 
OUTER APPLY 
(
    -- Join clause depends on how you're grouping 
    -- in the report. 
    SELECT TOP 1 
     i.SyncDate 
    FROM System i 
    WHERE 
     i.SystemSource = 'newsys' 
     AND i.Branch = p.Branch 
     AND i.DriverName = p.DriverName 
     AND i.Date < p.Date 
    ORDER BY 
     i.SyncDate DESC 
) l 
WHERE 
    (p.Date BETWEEN @datefrom AND @DateTo) AND 
(p.Branch IN (@branch)) AND 
    (p.SystemSource = 'newsys') AND 
    (p.SystemSource <> 'oldsys') -- This will never be evaluated 
GROUP BY 
    p.Pizza, p.ToppingCount, p.DriverName, p.Date, p.SyncDate, p.BranchName, p.Branch, l.SyncDate 
ORDER BY 
    p.Branch, p.DriverName, p.Date 

Таким образом, вы можете просто просуммировать синхронизации дельты в отчете. Я не знаю достаточно о запросе, но я сделал предположение, что:

Вы хотите, чтобы время между последней датой синхронизации до текущего столбца [даты] соответствовало вашей формуле для данной ветви и драйвера.

Приносим извинения, если есть проблемы с синтаксисом, я печатаю это без ссылки.

+0

Спасибо за ваши замечания Я пробовал это и получил 0. попытается поиграть с этим больше. –

+0

Если вы хотите пустое поле, вы можете поместить выражение if вне, измените значение 0.0 на «» и поместите вычисление (включая десятичное преобразование) в сторону другой части iif. – Phyiber

0

Вы можете добавить столбец row_number в запрос как так ..

SELECT ToppingCount, 
     DriverName, 
     COUNT(Pizza) AS Count, 
     Date, 
     SyncDate, 
     BranchName, 
     Branch, 
     ROW_NUMBER() OVER (ORDER BY Branch,DriverName,Date) Rn 
FROM System 
WHERE (Date BETWEEN @datefrom AND @DateTo) 
     AND (Branch IN (@branch)) 
     AND (SystemSource = 'newsys') 
     AND (SystemSource <> 'oldsys') 
GROUP BY Pizza, 
     ToppingCount, 
     DriverName, 
     Date, 
     SyncDate, 
     BranchName, 
     Branch 
ORDER BY Branch, 
     DriverName, 
     Date 

Тогда просто проверить, чтобы увидеть, если вы на Rn = 1, прежде чем сделать свой расчет.

=iif(Fields!Rn.Value = 1, "", CDec(format(DateDiff("s",previous(Fields!SyncDate.Value),Fields!Date.Value)/60,"0.00"))) 

или

=iif(Fields!Rn.Value = 1, 0, CDec(format(DateDiff("s",previous(Fields!SyncDate.Value),Fields!Date.Value)/60,"0.00"))) 

, если вам необходимо сбросить ROW_NUMBER для групп, можно добавить раздел По сбросить номер 1

+0

Удивительно, что у вас будет –

+0

Просто попробовал, и он говорит: «Конструкция или инструкция OVER SQL не поддерживается». но когда я запускаю отчет, он запускается, но дает -465 –

+0

Хм .. Вы работаете sql 2005 или выше? – JamieD77

Смежные вопросы