Shuaib wasif khan Ответов: 2

Как получить два верхних значения из multiplecolum в sqlserver


всем привет

у меня есть три столбца в таблице marksheet предположим

test1 со значением 70, test2 со значением 50 и test3 со значением 40

теперь как я могу получить два верхних значения из sqlserver которые будут равны 70 и 50




заранее спасибо

Что я уже пробовал:

hello all

i have three columns in table marksheet suppose

test1 with value 70 ,test2 with value 50 and test3 with value 40

now how can i get top two values from sqlserver which will be 70 and 50




thanks in advance

2 Ответов

Рейтинг:
2

kosmas kafataridis

Если я правильно вас понял

CREATE TABLE #test (
    test1 int,
   test2 int,
   test3 int
);
insert into #test (test1, test2, test3) values (70, 50, 30);
insert into #test (test1, test2, test3) values (30, 70, 50);
insert into #test (test1, test2, test3) values (50, 30, 70);
select 
case when test1 >test2 and test1>test3 then test1 when test2>test1 and test2>test3 then test2 else test3 end firstbigger ,
	case when 
		test1 >test2 and test1>test3  then case when test2>test3 then test2 else test3 end 
		when test2>test1 and test2>test3 then case when test1>test3 then test1 else test3 end  
	else case when test2>test1 then test2 else test1 end  end secondbigger

from #test

drop table #test


Рейтинг:
2

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