0

я имею следующую хранимую процедуру:вычисляемого столбца SQL в хранимой процедуре

SELECT 
    a.OtherMeasurementID 
    , a.MeasurementID 
    , b.MeasurementCode 
    , a.OperationDate 
    , a.OperationTime 
    , a.AccumulatedMass 
    , CAST(a.OperationDate AS datetime) + CAST(a.OperationTime as datetime) oDateTime 
INTO 
    #_OtherMeasurement 
FROM 
    _OtherMeasurement a 
INNER JOIN 
    _Measurement b ON a.MeasurementID = b.MeasurementID 
WHERE 
    a.OperationDate >= DATEADD(DAY, -1, @StartDate) 
    AND a.OperationDate <= DATEADD(DAY, 1, @EndDate) 
    AND b.MeasurementCode LIKE '%Inlet%' 

--============================================ 
;with CTE as 
(
    select 
     T1.OtherMeasurementID 
     , t1.MeasurementID 
     , T1.MeasurementCode 
     , T1.OperationDate 
     , T1.OperationTime 
     , T1.AccumulatedMass 
     , case when T1.AccumulatedMass = 0 then 0 else T1.AccumulatedMass - T2.AccumulatedMass end as ReceivedMass 
     , T1.oDateTime 
    From 
     #_OtherMeasurement T1 
    left join 
     #_OtherMeasurement T2 on T1.MeasurementCode = T2.MeasurementCode 
        and DATEADD(Hour, -1, T1.oDateTime) = T2.oDateTime 
    left join 
     #_OtherMeasurement T3 on T1.MeasurementCode = T3.MeasurementCode 
        and DATEADD(Hour, 1, T1.oDateTime)= T3.oDateTime 
) 
,CTE2 as 
(  
    select 
     T1.OtherMeasurementID 
     , T1.MeasurementID 
     , T1.MeasurementCode 
     , T1.OperationDate 
     , T1.OperationTime 
     , T1.AccumulatedMass    
     , case when T1.AccumulatedMass = 0 then (T2.ReceivedMass + T3.ReceivedMass)/2 else T1.ReceivedMass end as ReceivedMass   
    From 
     CTE T1 
    left join 
     CTE T2 on T1.OperationDate = T2.OperationDate and T1.MeasurementCode = T2.MeasurementCode 
       and DATEADD(Hour, -1, T1.oDateTime)= T2.oDateTime 
    left join 
     CTE T3 on T1.OperationDate = T3.OperationDate and T1.MeasurementCode = T3.MeasurementCode 
       and DATEADD(Hour, 1, T1.oDateTime)= T3.oDateTime 
) 
select 
    OtherMeasurementID, 
    MeasurementID, 
    MeasurementCode, 
    OperationDate, 
    OperationTime, 
    AccumulatedMass, 
    coalesce(ReceivedMass, 0) ReceivedMass 
from 
    CTE2 
WHERE 
    OperationDate BETWEEN @StartDate AND @EndDate 

, если вы видите на CTE2, есть линия

case when T1.AccumulatedMass = 0 then (T2.ReceivedMass + T3.ReceivedMass)/2 else T1.ReceivedMass end as ReceivedMass 

Эта линия будет работать, если нулевое значение накопленного массы в тот же день. Данные для таблицы являются почасовыми. Если нулевое значение 10/января/2015 23:00:00, то линия не будет работать. потому что следующее значение должно быть на 11 января/2015 00:00:00. sample statement, если значение до и после нуля находится в ту же дату, расчет будет работать. Если нет, то работать не будет.

Мой вопрос в том, как я могу заставить формулу работать даже следующее значение после нуля на другую дату ..?

Пример:

OtherMeasurementID MeasurementID MeasurementCode OperationDate OperationTime AccumulatedMass ReceivedMass 
17      1   Water Inlet   13-Oct-2014 17:00:00   236265.36 518.58 
18      1   Water Inlet   13-Oct-2014 18:00:00   236795.95 530.59 
19      1   Water Inlet   13-Oct-2014 19:00:00   0   533.57 
20      1   Water Inlet   13-Oct-2014 20:00:00   237865.13 536.55 
21      1   Water Inlet   13-Oct-2014 21:00:00   238404.14 539.01 
22      1   Water Inlet   13-Oct-2014 22:00:00   238944.05 539.91 
23      1   Water Inlet   13-Oct-2014 23:00:00   0   0 
24      1   Water Inlet   14-Oct-2014 0:00:00   240026  240026 
25      1   Water Inlet   14-Oct-2014 1:00:00   240566.98 540.98 
26      1   Water Inlet   14-Oct-2014 2:00:00   241107.92 540.94 

Если вы можете видеть на приведенном выше примере. в 13/Oct/2015 19:00, накопленная масса равна нулю. поэтому формула для расчета принимаемой массы равна (previous receivedmass before zero + next receivedmass after zero)/2

Но, если вы видите 13/Oct/2015 23:00, приведенная выше формула не работает, потому что next receivedmass after zero находится на другой дате, которая равна 14/окт/2015 00:00.

спасибо.

+0

Вы можете попытаться упростить запрос вниз только то, что имеет дело с проблемой под рукой (то есть я бы ожидать ' CTE' в настоящее время может быть заменен табличной переменной) с некоторыми примерными данными и ожидаемыми результатами. На данный момент есть много запросов, чтобы мы могли понять, и мы: а) не имеем доступа к вашей базе данных и б) не знаем, чего вы пытаетесь достичь. –

+0

@Damien_The_Unbeliever, добавлено. – Haminteu

+0

Вы присоединяетесь к 'T1.OperationDate = T3.OperationDate', таким образом, вы ограничиваете его в тот же день. Что произойдет, если вы удалите эту часть из 'join'? (и удалите 'T1.OperationDate = T2.OperationDate', а также - ту же проблему, если' accumulatedmass' был равен нулю в '00: 00') –

ответ

0

Простое изменение от:

left join CTE T3 on T1.OperationDate = T3.OperationDate and T1.MeasurementCode = T3.MeasurementCode and DATEADD(Hour, 1, T1.oDateTime)= T3.oDateTime 

к:

left join CTE T3 on (T1.OperationDate = T3.OperationDate and T1.MeasurementCode = T3.MeasurementCode and DATEADD(Hour, 1, T1.oDateTime)= T3.oDateTime) or (dateadd(day, 1, T1.OperationDate) = T3.OperationDate and T1.MeasurementCode = T3.MeasurementCode and DATEADD(Hour, 1, T1.oDateTime)= T3.oDateTime) 
Смежные вопросы