Предполагая, что это запрос агрегации, вы можете просто выбрать дату в квартале:
order by min(b.CDate)
Вы можете отсортировать напрямую по кварталу, если вы представляете их как YYYYQn вместо QnYYYY.
A CASE
выражение не требуется. Вы также можете упростить логику c до:
CONCAT(DATENAME(YEAR, DATEADD(MONTH, -6, B.CDate)),
'Q', DATENAME(QUARTER, DATEADD(MONTH, -6, B.CDate))
) as Quarter,
То есть ваш квартал - это «стандартный» квартал, который вы получаете, когда вычитаете 6 месяцев.