Na consulta a seguir, uso um @IsDescOrder
para definir a ordem.
Tento especificar o order by
(ou seja, ASC
ou DESC
), mas recebo um erro. Posso remover o, DESC | ASC
mas ambas as opções retornarão o mesmo conjunto porque retornará a ordem padrão:
declare @IsDescOrder bit = 0
;with cte as
(
select
*
from (
select *, r = row_number() over (partition by NameId
order by
case @IsDescOrder
when 1 then size_mbps DESC,
when 0 then size_mbps ASC
end
)
from #temp_table
) a
where r <= 20
)
select
* from
cte
Recebo erro Incorrect syntax near the keyword 'DESC'.
.
Existe uma solução alternativa?
Você tem a ideia certa, mas só precisa mudar CASE
um pouco a maneira como está trabalhando:
ORDER BY
CASE WHEN @IsDescOrder = 1 THEN DateKey ELSE '' END DESC,
CASE WHEN @IsDescOrder = 0 THEN DateKey ELSE '' END ASC
Ele contém duas cláusulas para ordenar, uma cláusula de ordem decrescente seguida por outra crescente.
Quando @IsDescOrder
é 1, então a cláusula descendente é usada, caso contrário, a cláusula ascendente. Ao fornecer ELSE ''
, isso garante que o pedido indesejado (ou ASC
ou DESC
) seja efetivamente ignorado.
EDITAR
Conforme apontado pelo OP, isso causava um erro se a coluna do pedido fosse numérica. Para resolver isso, substitua a string vazia ( ''
) por 0
:
ORDER BY
CASE WHEN @IsDescOrder = 1 THEN DateKey ELSE 0 END DESC,
CASE WHEN @IsDescOrder = 0 THEN DateKey ELSE 0 END ASC
Isso funciona da mesma forma que a solução com a string vazia, mas evita o erro de conversão de tipo ao usar colunas numéricas.
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras