jafm Posted March 6, 2013 at 03:00 PM Report #498134 Posted March 6, 2013 at 03:00 PM 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
Rechousa Posted March 7, 2013 at 01:41 AM Report #498244 Posted March 7, 2013 at 01:41 AM 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
jafm Posted March 7, 2013 at 05:58 PM Author Report #498290 Posted March 7, 2013 at 05:58 PM 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?
Rechousa Posted March 7, 2013 at 06:46 PM Report #498307 Posted March 7, 2013 at 06:46 PM 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; http://img832.imageshack.us/img832/4550/sqlg.png Espero ter ajudado. Pedro Martins Sharing is Knowledge! http://www.linkedin.com/in/rechousa
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now