Usuário com melhor resposta
Pesquisa em BD

Pergunta
-
Bom dia.
Solicito uma vez mais a vossa ajuda.
Necessito de verificar uma BD (ex. abaixo) e obter o ultimo ano e o último mês pago por nº de cliente.
Estou a executar a query com recurso ao MAX(campo) no entanto não esta a dar o resultado pretendido.
no mês, por ex., o ultimo pago é sempre 12 pois existem sempre pagamentos em anos anteriores no mês 12.
não me retorna o ultimo mês pago do ultimo ano.
agradeço a vossa ajuda.
Tabela ex.
Nº| Ano | Mês| Pago
1 |2016 | 1 | True
1 |2016 | 2 | True
1 |2016 | 3 | False
...
2 |2015| 8 | True
2 |2015| 9 | False
...
3 |2016|12 | True
3 |2017|1 | True
3 |2017|2 | FalseResultado pretendido:
Nº | Ano | Mês
1 |2016| 2
2 |2015| 8
3 |2017| 1
Respostas
-
Não entendi sua dificuldade nesse problema , apenas uma query agrupada,
se for isso que realmente que vc precisa
DECLARE @tabela TABLE ( Numero INT, Ano INT, Mes INT, Pago NCHAR(5) ); INSERT INTO @tabela ( Numero, Ano, Mes, Pago ) VALUES (1, 2016, 1, 'True'), (1, 2016, 2, 'True'), (1, 2016, 3, 'False'), (2, 2015, 8, 'True'), (2, 2015, 9, 'False'), (3, 2016, 12, 'True'), (3, 2017, 1, 'True'), (3, 2017, 2, 'False'); SELECT t.Ano, Numero = MAX(t.Numero), Mes = MAX(t.Mes), t.Pago FROM @tabela AS t WHERE t.Pago = 'True' GROUP BY t.Ano, t.Pago ORDER BY Numero;
"Se a resposta for útil ou ajudar ,não esqueça de marcar"
Wesley Neves - Brasilia-DF
https://wesleyneves.wordpress.com/
MTA-SQL Server
MTA- Web Development
Analista Desenvolvedor.NET
Pós-Graduando em Banco de Dados
Wesley Neves
- Sugerido como Resposta Jose Luiz Borges segunda-feira, 4 de dezembro de 2017 10:30
- Marcado como Resposta Filipe B CastroModerator segunda-feira, 11 de dezembro de 2017 12:31
-
Bom dia,
Nuno, experimente mais ou menos dessa forma:
with CTE_RN as ( select *, ROW_NUMBER() OVER(PARTITION BY Numero ORDER BY Ano DESC, Mes Desc) as RN from Tabela where Pago = 'True' ) select * from CTE_RN where RN = 1
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
- Sugerido como Resposta Junior Galvão - MVPMVP segunda-feira, 4 de dezembro de 2017 21:52
- Marcado como Resposta Filipe B CastroModerator segunda-feira, 11 de dezembro de 2017 12:31
Todas as Respostas
-
Não entendi sua dificuldade nesse problema , apenas uma query agrupada,
se for isso que realmente que vc precisa
DECLARE @tabela TABLE ( Numero INT, Ano INT, Mes INT, Pago NCHAR(5) ); INSERT INTO @tabela ( Numero, Ano, Mes, Pago ) VALUES (1, 2016, 1, 'True'), (1, 2016, 2, 'True'), (1, 2016, 3, 'False'), (2, 2015, 8, 'True'), (2, 2015, 9, 'False'), (3, 2016, 12, 'True'), (3, 2017, 1, 'True'), (3, 2017, 2, 'False'); SELECT t.Ano, Numero = MAX(t.Numero), Mes = MAX(t.Mes), t.Pago FROM @tabela AS t WHERE t.Pago = 'True' GROUP BY t.Ano, t.Pago ORDER BY Numero;
"Se a resposta for útil ou ajudar ,não esqueça de marcar"
Wesley Neves - Brasilia-DF
https://wesleyneves.wordpress.com/
MTA-SQL Server
MTA- Web Development
Analista Desenvolvedor.NET
Pós-Graduando em Banco de Dados
Wesley Neves
- Sugerido como Resposta Jose Luiz Borges segunda-feira, 4 de dezembro de 2017 10:30
- Marcado como Resposta Filipe B CastroModerator segunda-feira, 11 de dezembro de 2017 12:31
-
Bom dia,
Nuno, experimente mais ou menos dessa forma:
with CTE_RN as ( select *, ROW_NUMBER() OVER(PARTITION BY Numero ORDER BY Ano DESC, Mes Desc) as RN from Tabela where Pago = 'True' ) select * from CTE_RN where RN = 1
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
- Sugerido como Resposta Junior Galvão - MVPMVP segunda-feira, 4 de dezembro de 2017 21:52
- Marcado como Resposta Filipe B CastroModerator segunda-feira, 11 de dezembro de 2017 12:31
-
Bom dia,
Por falta de retorno essa thread está encerrada.
Se necessário, favor abrir uma nova thread.
Atenciosamente,Filipe B de Castro
Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita
MSDN Community Support
Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.