计算存储过程中的 SQL 列
Calculated SQL column in stored procedure
我有以下存储过程:
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
如果同一天累积质量的值为零,则该行将起作用。 table 的数据是按小时计算的。如果零值位于 10/Jan/2015 23:00:00 上,则该行将不起作用。因为下一个值应该是 11/Jan/2015 00:00:00。示例语句是,如果零前后的值在同一日期,则计算有效。如果没有,那就不行了。
我的问题是,即使零之后的下一个值在不同的日期,我怎样才能使公式工作..?
示例:
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/Oct/2015 00:00.
谢谢。
简单更改自:
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)
我有以下存储过程:
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
如果同一天累积质量的值为零,则该行将起作用。 table 的数据是按小时计算的。如果零值位于 10/Jan/2015 23:00:00 上,则该行将不起作用。因为下一个值应该是 11/Jan/2015 00:00:00。示例语句是,如果零前后的值在同一日期,则计算有效。如果没有,那就不行了。
我的问题是,即使零之后的下一个值在不同的日期,我怎样才能使公式工作..?
示例:
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/Oct/2015 00:00.
谢谢。
简单更改自:
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)