CHill60
Альтернативой решению 1 (которое повторяет результаты для каждой строки в таблице #test) является использование той же тестовой установки
select top 2 * from
(
select distinct(test1) as datum
from #test
union
select distinct(test2)
from #test
union
select distinct(test3)
from #test
) q
order by 1 desc
То есть поместите все интересующие значения в один запрос, убедившись, что нет дубликатов (distinct и union делают это), затем упорядочите этот результат и выберите верхние 2 записи. Результаты:
datum
70
50
Вы можете использовать CTE вместо подзапроса, если хотите
;WITH cte as
(
select distinct(test1) as datum
from #test
union
select distinct(test2)
from #test
union
select distinct(test3)
from #test
)
select top 2 * from cte
order by 1 desc
Если вы хотите, чтобы результаты были в одной строке, но в двух столбцах, то вам следует использовать PIVOT. Существует аккуратный трюк с использованием ROW_NUMBER который даст вам ТОП 2 без использования этого ключевого слова:
;WITH cte as
(
select distinct(test1) as datum
from #test
union
select distinct(test2)
from #test
union
select distinct(test3)
from #test
)
select * from
(
select ROW_NUMBER() OVER (ORDER BY datum desc) AS rn, datum
from cte
) base
PIVOT (MAX(datum) FOR rn in ([1],[2])) pvt