SQL SERVER 2005 以降を使用している場合は、これを行うことができます
SELECT
*,
CALC.sortlist
from events as e
outer apply
(
select
case
WHEN ((e.month > 9 OR (e.month =9 and e.days >= 22)) AND e.year <= 2012)then 'list1'
WHEN (e.year <= 2013) then 'list2'
WHEN (e.year > 2013)then 'list3'
end as sortlist
) as CALC
order by
CALC.sortlist, CALC.date,
case when CALC.sortlist = 'list3' then e.year else null end
これを行うこともできますが、大文字と小文字が「list3」に等しい場合、年ごとに正確に並べ替えるわけではありません(式を変更する場合は、同様case
に変更する必要があります)order by
SELECT
*,
case
WHEN ((e.month > 9 OR (e.month =9 and e.days >= 22)) AND e.year <= 2012)then 'list1'
WHEN (e.year <= 2013) then 'list2'
WHEN (e.year > 2013)then 'list3'
end as sortlist
from events as e
order by
sortlist, e.date,
case when e.year > 2013 then e.year else null end