Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

jafm

Ordenar por Desconto

Recommended Posts

jafm

Boa tarde,

eu tenho os seguintes dados na base de dados

ID;Desconto;Qtd;DataInicio

100.am; 0; 2; 08-08-2012

100.am; 20; 3; 28-11-2012

100.am; 30; 3; 25-12-2012

101.am; 0; 20; 10-08-2012

101.am; 11,5; 8; 28-11-2012

101.am; 30; 2; 25-12-2012

101.am; 50; 9; 18-01-2012

O objectivo seria colocar tudo algo deste genero

artigo;desconto;qtd;dataInicio;desconto2;qtd;DataInicio;Desconto3;qtd;DataInicio;Desconto4;Qtd;DataInicio.

Será que me podem ajudar a pensar como poderei colocar um regra na query para que me devolva o da forma acima

Share this post


Link to post
Share on other sites
Rechousa

Olá,

Arranjei uma solução, talvez não seja a mais eficiente, mas aparentemente funciona.

O que foi dividir o objectivo em duas partes:

a) Atribuir um ranking a cada desconto (imaginei que seria agrupado por produto e ordenado por data de início);

b) Construir a query final

Usei a variável @TabelaComDados do tipo TABLE para colocar os dados que apresentaste no teu post e usei a variável @TabelaTemporaria também do tipo TABLE para armazenar o ranking

-- Esta é a tua tabela com os dados que apresentaste
DECLARE @TabelaComDados TABLE (id VARCHAR(20), Desconto NUMERIC(5, 1), Qtd INT, DataInicio DATE);

-- Esta tabela temporária é usada para armazenar o ranking do produto / desconto
DECLARE @TabelaTemporaria TABLE (id VARCHAR(20), Desconto NUMERIC(5, 1), Qtd INT, DataInicio DATE, MyRanking INT NULL);

-- Insere os teus dados de exemplo
INSERT INTO @TabelaComDados VALUES ('100.am', '0', '2', '2012-08-08');
INSERT INTO @TabelaComDados VALUES ('100.am', '20', '3', '2012-11-28');
INSERT INTO @TabelaComDados VALUES ('100.am', '30', '3', '2012-12-25');
INSERT INTO @TabelaComDados VALUES ('101.am', '0', '20', '2012-08-10');
INSERT INTO @TabelaComDados VALUES ('101.am', '11.5', '8', '2012-11-28');
INSERT INTO @TabelaComDados VALUES ('101.am', '30', '2', '2012-12-25');
INSERT INTO @TabelaComDados VALUES ('101.am', '50', '9', '2012-01-18');

-- Atribuiu o ranking e insere na tabela temporária
INSERT INTO @TabelaTemporaria
SELECT *, RANK() OVER (PARTITION BY id ORDER BY DataInicio ASC) AS MyRanking
   FROM @TabelaComDados
   ORDER BY id ASC, DataInicio ASC

-- Query a apresentar
-- NOTA: Está limitada a quatro descontos, se quiseres mais terás de acrescentar ou de torná-la dinâmica
SELECT DISTINCT
t.id, T1.Desconto AS Desconto1, T1.Qtd AS Qtd1, T1.DataInicio AS DataInicio1,
   T2.Desconto AS Desconto2, T2.Qtd AS Qtd2, T2.DataInicio AS DataInicio2,
   T3.Desconto AS Desconto3, T3.Qtd AS Qtd3, T3.DataInicio AS DataInicio3,
   T4.Desconto AS Desconto4, T4.Qtd AS Qtd4, T4.DataInicio AS DataInicio4
   FROM @TabelaTemporaria t
   LEFT JOIN @TabelaTemporaria t1 ON t.id = t1.id AND t1.MyRanking = 1
   LEFT JOIN @TabelaTemporaria t2 ON t.id = t2.id AND t2.MyRanking = 2
   LEFT JOIN @TabelaTemporaria t3 ON t.id = t3.id AND t3.MyRanking = 3
   LEFT JOIN @TabelaTemporaria t4 ON t.id = t4.id AND t4.MyRanking = 4;

Mais do que fazeres copy-paste para o Management Studio e para a tua aplicação é importante que percebas o que foi feito. Se tiveres dúvidas diz, que estamos cá para ajudar.

Espero ter ajudado.


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
jafm

Sem duvida que foi uma grande ajuda.

Não consegui perceber como é que fazes a subdivisão dos descontos? Fazer através do PARTITION mas neste caso fizeste a partir do ID e a Data?

Share this post


Link to post
Share on other sites
Rechousa

Olá,

A função RANK do SQL Server permite apresentar o ranking (1, 2, 3.... N) para determinada chave única, com determinada ordenação.

Neste caso, a chave única é o ID porque o que pretendes (e por aquilo que percebi) é ordenares os descontos por cada ID. Neste caso ordenei os descontos pela data de forma ASCENDING (mas poderá ser por outra ordem).

Se executares a linha seguinte vais perceber:

SELECT * FROM @TabelaTemporaria;

E o resultado é este:

- a azul está a instrução SQL;

- a vermelho aparecem os dados (com o ranking) para o ID 100.am;

- a verde aparecem os dados (com o ranking) para o ID 101.am;

sqlg.png

Espero ter ajudado.


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.