Ir para o conteúdo
jafm

Ordenar por Desconto

Mensagens Recomendadas

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.