При использовании UNION
имена столбцов из первого SELECT
возвращаются для всего набора результатов. Таким образом, даже если вы укажете «TotalBookingsWithoutRecurrance», «TotalRecurrance» и «TotalBookingsWithRecurrance», заголовок столбца вашего набора результатов (учитывая ваш текущий пример) будет «TotalRecurrance».
Я считаю, что ваша проблема заключается в вашем последнем SELECT :
SELECT SUM(TotalRecurrance + TotalBookingsWithoutRecurrance) as TotalBookings, TotalBookingsWithRecurrance, RoomID FROM CTE_BOOKINGS Group BY RoomID order by 1 desc
TotalBookingsWithRecurrance не группируется, и вы не выполняете какое-то агрегирование - отсюда и ошибка.
Чтобы оставить как есть ' d необходимо сделать:
SELECT SUM(TotalRecurrance + TotalBookingsWithoutRecurrance) as TotalBookings, TotalBookingsWithRecurrance, RoomID
FROM CTE_BOOKINGS
GROUP BY RoomID, TotalBookingsWithRecurrance
ORDER BY 1 DESC
Однако это добавит дополнительный уровень группировки, который, как я подозреваю, вам не нужен.
Кроме того, кажется, что ваши столбцы не выровнены между вашими Объединенные операторы, что является обязательным - по крайней мере, это лучшая практика (в любом случае для меня).
Я не могу это проверить, но попробуйте сделать что-то вроде следующего:
WITH CTE_BOOKINGS ( RoomID, RecurranceType, Recurrance, UnknownCol1, UnknownCol2 )
AS (
SELECT
RM.roomID AS RoomID,
'TotalBookingsWithoutRecurrance' AS RecurranceType,
COUNT ( BK.pkBookingID ) AS Recurrance,
0 AS UnknownCol1,
0 AS UnknownCol2
FROM dbo.tblBooking BK WITH (NOLOCK)
INNER JOIN dbo.tblBookingItem BI WITH (NOLOCK) ON BK.pkBookingID=BI.fkBookingID
INNER JOIN dbo.tblBookingDateTime BDT WITH (NOLOCK) ON BK.pkBookingID=BDT.fkBookingID
INNER JOIN Enterprise.tblRooms RM WITH (NOLOCK) ON BI.fkItemID=RM.roomID AND RM.fkResourceId=1
WHERE BK.deleteBooking=0
AND BDT.UTC_bookingEnd > GETUTCDATE()
AND BI.primaryRoom=1
AND BI.Active=1
AND NOT EXISTS (select * from tblBookingRecurrance where fkBookingID=BK.pkBookingID AND ACTIVE=1)
AND RM.roomID=16867
GROUP BY RM.roomID
UNION ALL
SELECT
RM.roomID AS RoomID,
'TotalRecurrance' AS RecurranceType,
COUNT ( DISTINCT BR.fkRecurranceID ) AS Recurrance,
0 AS UnknownCol1,
0 AS UnknownCol2
FROM dbo.tblBooking BK WITH (NOLOCK)
INNER JOIN dbo.tblBookingItem BI WITH (NOLOCK) ON BK.pkBookingID=BI.fkBookingID
INNER JOIN dbo.tblBookingDateTime BDT WITH (NOLOCK) ON BK.pkBookingID=BDT.fkBookingID
INNER JOIN Enterprise.tblRooms RM WITH (NOLOCK) ON BI.fkItemID=RM.roomID AND RM.fkResourceId=1
INNER JOIN tblBookingRecurrance BR WITH (NOLOCK) ON BK.pkBookingID=BR.fkBookingID
WHERE BK.deleteBooking=0
AND BDT.UTC_bookingEnd > GETUTCDATE()
AND BI.primaryRoom=1
AND BI.Active=1
AND RM.roomID=16867
AND BR.active=1
GROUP BY RM.roomID
UNION ALL
SELECT
RM.roomID AS RoomID,
'TotalBookingsWithRecurrance' AS RecurranceType,
COUNT ( BK.pkBookingID ) AS Recurrance,
0 AS UnknownCol1,
0 AS UnknownCol2
FROM dbo.tblBooking BK WITH (NOLOCK)
INNER JOIN dbo.tblBookingItem BI WITH (NOLOCK) ON BK.pkBookingID=BI.fkBookingID
INNER JOIN dbo.tblBookingDateTime BDT WITH (NOLOCK) ON BK.pkBookingID=BDT.fkBookingID
INNER JOIN Enterprise.tblRooms RM WITH (NOLOCK) ON BI.fkItemID=RM.roomID AND RM.fkResourceId=1
WHERE BK.deleteBooking=0
AND BDT.UTC_bookingEnd > GETUTCDATE()
AND BI.primaryRoom=1
AND BI.Active=1
AND RM.roomID=18841
GROUP BY RM.roomID
)
SELECT
SUM (
CASE WHEN RecurranceType IN ( 'TotalRecurrance', 'TotalBookingsWithoutRecurrance' ) THEN Recurrance ELSE 0 END
) AS TotalBookings,
SUM (
CASE WHEN RecurranceType = 'TotalBookingsWithRecurrance' THEN Recurrance ELSE 0 END
) AS TotalBookingsWithRecurrance,
RoomID
FROM CTE_BOOKINGS
GROUP BY RoomID
ORDER BY 1 DESC;