Case When over 2 columns return results into 1 output column
Something like this (untested) should work for you:

select
  *,
  case q20
    when '8' then 1
    when '9' then 1
    else case q46
      when '8' then 1
      when '9' then 1
      else 0
    end
  end as promoter
from ##csat_resp;


You could also write the same logic as:

case when q20 in ('8','9') or q46 in ('8','9') then 1 else 0 end


or in SQL Server 2012 and later:

IIF(Q20 IN (8, 9) OR T.Q46 IN (8, 9), 1, 0)