Como fazer uma query com uma ordem específica digitada pelo usuário

Hoje vou mostrar como fazer uma query no SQL Server, utilizando uma ordenação específica passada pelo usuário.

Imagine que você está fazendo um relatório, que utiliza uma query SQL, porém você não consegue usar o ORDER BY nativamente, pois o usuário precisa que o relatório saia em uma ordem específica de digitação.

Então se pegarmos por exemplo, o cadastro de produtos, o que faz mais sentido é que a ordem seja por código, como 0001, 0002, 0003, 0004 e assim por diante. Ou por descrição, como Banana, Maçã, Pêra, etc.

Porém o usuário precisa dessa listagem em uma ordem específica digitada por ele, então deverá sair por exemplo, 0003, 0002, 0001 e 0004. Como tratar nesse cenário?

Pois bem jovens, a lógica para fazermos isso, seria +- assim:

  1. Criar uma tabela temporária que tenha dois campos, 1 contendo um valor sequência, e 1 sendo o campo de código da tabela em questão (seja produto, cliente, fornecedor, etc)
  2. Inserir os valores nessa temporária, deixando a ordem conforme a digitação do usuário
  3. Fazer um SELECT na tabela de destino (SB1 de Produtos, SA1 de Clientes, SA2 de Fornecedores, etc) fazendo um join com essa temporária criada no item 1
  4. Dropar a tabela temporária criada

Então abaixo o código da query:

--Criando a temporária com duas colunas, sequencia e código do produto
CREATE TABLE #TempProds
(
	sequencia VARCHAR(5),
	produto VARCHAR(15)
)


--Inserindo os valores, conforme digitação do usuário na segunda coluna
INSERT INTO #TempProds Values('1', '0003');
INSERT INTO #TempProds Values('2', '0002');
INSERT INTO #TempProds Values('3', '0001');
INSERT INTO #TempProds Values('4', '0004');


--Executando query para selecionar as informações, fazendo join com tabela temporária criada
SELECT
	B1_COD,
	B1_DESC,
	B1_CEST,
	B1_POSIPI
FROM
	SB1010 SB1
	INNER JOIN #TempProds TMP ON (
		TMP.produto = B1_COD
	)
WHERE
	B1_FILIAL = ' '
	AND SB1.D_E_L_E_T_ = ' '
ORDER BY
	TMP.sequencia


--Dropando a tabela temporária criada
DROP TABLE #TempProds;

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan Atilio (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

Deixe uma resposta