I have 2 columns which have an occupancy column and contains values of 0 and 1.
Here is an example:
After group by
based on other columns, these columns will be combined and the average will be 0.5 since 0+1/2 = 0.5 or 1/2.
So how do I do this: case when avg(occupancy) = 1/2 or 0.5 then '1' else '0'
?
I know something about SQL round down 1/2 to 0 or something along that lines
What I have tried:
case when
Avg(occupancy) = 1.0/2.0
Here is my full view code.
CREATE VIEW [iot].[v_test]
AS
SELECT
ro.[RoomCode],
ro.[RoomName],
ro.[DeviceID],
ro.[TpID],
CAST(avg(ro.[Temperature]) AS decimal(10, 1)) AS [Temperature],
CASE
WHEN avg(cast(occupancy as decimal)) between 0.01 and 1.0
THEN '1'
WHEN avg(cast(occupancy as decimal)) = 1/2.0
THEN '1'
ELSE
'0'
END AS Occupancy,
(DATEADD(HOUR, DATEPART(HOUR, ro.[LocalTime]), DATEADD( MINUTE, 30 * CAST((DATEDIFF(MINUTE, '19000101', ro.[LocalTime]) / 30) % 2 AS INT),
CAST(CAST(ro.[LocalTime] AS DATE) AS DATETIME)))) AS [Time],
ctt.[DAY],
cs.ClassroomStatus
FROM
[iot].[v_RoomOccupancy] ro
LEFT OUTER JOIN
[iot].[ClassTimeTable] ctt
ON ro.RoomCode = ctt.ROOMID
AND (ro.LocalTime
BETWEEN ctt.CLASSSTARTDATE AND ctt.CLASSENDDATE
)
CROSS APPLY
(
SELECT
CASE
WHEN (ro.LocalTime BETWEEN ctt.CLASSSTARTDATE AND ctt.CLASSENDDATE)
AND (cast(occupancy as decimal) between 0.1 and 1.0 )
THEN 'Booked And Occupied'
WHEN ((ro.LocalTime NOT BETWEEN ctt.CLASSSTARTDATE AND ctt.CLASSENDDATE) OR ( ctt.CLASSSTARTDATE IS NULL AND ctt.CLASSENDDATE IS NULL))
AND (cast(occupancy as decimal) between 0.1 and 1.0 )
THEN 'Not Booked but Occupied'
WHEN (ro.LocalTime BETWEEN ctt.CLASSSTARTDATE AND ctt.CLASSENDDATE)
AND cast(occupancy as decimal) <= 0.0
THEN 'Booked but Not Occupied'
WHEN ((ro.LocalTime NOT BETWEEN ctt.CLASSSTARTDATE AND ctt.CLASSENDDATE) OR (ctt.CLASSSTARTDATE IS NULL AND ctt.CLASSENDDATE IS NULL))
AND cast(occupancy as decimal) <= 0.0
THEN 'Not Booked and Not Occupied'
ELSE
'Null'
END AS ClassroomStatus
)AS cs
GROUP BY
ro.[RoomCode],
ro.[RoomName],
ro.[DeviceID],
ro.[TpID],
(DATEADD(HOUR, DATEPART(HOUR, ro.[LocalTime]), DATEADD( MINUTE, 30 * CAST((DATEDIFF(MINUTE, '19000101', ro.[LocalTime]) / 30) % 2 AS INT),
CAST(CAST(ro.[LocalTime] AS DATE) AS DATETIME)))),
ctt.[DAY],
cs.ClassroomStatus;