Сумма затем разделить на группы по пункту в виде - PullRequest
0 голосов
/ 21 октября 2019

Таким образом, в основном после создания представления с помощью оператора case. Я хочу добавить предложение group by в текущем представлении ниже. как мне это сделать? пример оператора group by и пример case ниже

Вид с оператором case, который работает:

Create View v_ClassroomOccupancyJulytest
AS
Select 
ro.[RoomCode],
ro.[RoomName],
ro.[DeviceID],
ro.[Temperature],
ro.[LocalTime],
ctt.[DAY],
ctt.[DATETIME],
ctt.[DURATION],

CASE

WHEN (ro.LocalTime BETWEEN ctt.CLASSSTARTDATE AND ctt.CLASSENDDATE)  
    AND ro.Occupancy = 1 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 ro.Occupancy = 1 THEN 'Not Booked but Occupied'

WHEN (ro.LocalTime BETWEEN ctt.CLASSSTARTDATE AND ctt.CLASSENDDATE)
    AND ro.Occupancy = 0 THEN 'Booked but Not Occupied'

ELSE 'Not booked and Not Occupied' 

END AS ClassroomStatus


FROM V_RoomOccupancyJuly ro
left outer JOIN ClassTimeTable ctt
ON ro.RoomCode = ctt.ROOMID and (ro.LocalTime BETWEEN ctt.CLASSSTARTDATE AND ctt.CLASSENDDATE)

Я хочу использовать group by для группировки строк на основе [roomcode], [datetime] 30-минутный интервал и sum([occupancy])/3.

Я запустил представление создания с приведенным ниже кодом предложения group by, и оно возвращает ошибку:

Невозможно использоватьагрегат или подзапрос в выражении, используемом для группы по списку предложения GROUP BY

пример группы по

GROUP BY [RoomCode],
SUM([OCCUPANCY])/3,
DATEPART(YEAR[DATETIME]),
DATEPART(MONTH[DATETIME]),
DATEPART(DAY[DATETIME]),
DATEPART(HOUR[DATETIME]),
DATEPART(MINUTE[DATETIME])/30,

Почему sum([occupancy])/3? потому что каждые 30 минут есть 3 строки, следовательно, 3 занятия.

После выполнения предложения group by можно ли сделать оператор case на основе sum([occupancy])/3

CaseВот так:

CASE 
WHEN (SUM([OCCUPANCU])/3)>0 THEN '1'
ELSE '0'
END AS 1/2HrOccupancy

Вот чего я хочу достичь:

Пример источника данных: https://imgur.com/yEDUOv9

Чего я хочу достичь: https://imgur.com/SIPoTlC

логика, лежащая в основе [occupancy], заключается в том, что если любое значение в 3 строках (поскольку они сгруппированы с интервалом 30 минут) равно 1, значение занятости = 1если все значения равны 0, то [occupancy] значение равно = 0.

Что касается `[LocalTime] ', для которого я хочу использовать его для группировки, я также хочу, чтобы оно округлялось до ближайших 30минутпример 2:30, 3:00, 3:30

Что касается значения [temperature], я хочу найти среднее значение. возможно используя avg ()

Что касается [roomname], [deviceid], [weekno], [day], [classstartdate] и [classenddate], просто используйте существующее значение, которое является значением3 ряда

1 Ответ

1 голос
/ 21 октября 2019

На основе комментариев вы можете попробовать:

CREATE VIEW v_ClassroomOccupancyJulytest
AS
    SELECT  ro.[RoomCode] ,
            ro.[RoomName] ,
            ro.[DeviceID] ,
            AVG(ro.[Temperature]) AS [Temperature] ,
            CASE WHEN ( SUM(Occupancy) / 3 ) > 0 THEN '1'
                 ELSE '0'
            END AS [1/2HrOccupancy] ,
            ctt.[DAY] ,
            ctt.[DATETIME] ,
            ctt.[DURATION] ,
            cs.ClassroomStatus
    FROM    V_RoomOccupancyJuly ro
            LEFT OUTER JOIN 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 ro.Occupancy = 1
                                         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 ro.Occupancy = 1
                                         THEN 'Not Booked but Occupied'
                                         WHEN ( ro.LocalTime BETWEEN ctt.CLASSSTARTDATE
                                                             AND
                                                              ctt.CLASSENDDATE )
                                              AND ro.Occupancy = 0
                                         THEN 'Booked but Not Occupied'
                                         ELSE 'Not booked and Not Occupied'
                                    END AS ClassroomStatus
                        ) AS cs
    GROUP BY ro.[RoomCode] ,
            ro.[RoomName] ,
            ro.[DeviceID] ,
            ctt.[DAY] ,
            ctt.[DATETIME] ,
            ctt.[DURATION] ,
            cs.ClassroomStatus;
...