Dúvida em como agrupar alguns dados
Gente, o meu problema é o seguinte:
Tenho que pegar os seguintes dados no meu banco:
Codigo do Beneficiario / Nome do beneficiario / Data de Vencimento / Valor
0101 Diego Ribeiro 01/01/2010 R$ 50,00
0202 Mariano Silva 01/12/2009 R$ 60,00
0202 Mariano Silva 01/01/2010 R$ 60,00
0303 Noel Costa 01/11/2009 R$ 70,00
0303 Noel Costa 01/12/2009 R$ 70,00
0303 Noel Costa 01/01/2010 R$ 70,00
(...) (...) (...) (...)
Eu quero saber se tem alguma condição que eu coloque para pegar apenas os que aparecem 1, 2, ou 3 vezes no resultado final da minha consulta. Por exemplo, pegar somente os beneficiários com uma parcela em aberto (no caso, o beneficiário Diego Ribeiro).
Tenho que pegar os seguintes dados no meu banco:
Codigo do Beneficiario / Nome do beneficiario / Data de Vencimento / Valor
0101 Diego Ribeiro 01/01/2010 R$ 50,00
0202 Mariano Silva 01/12/2009 R$ 60,00
0202 Mariano Silva 01/01/2010 R$ 60,00
0303 Noel Costa 01/11/2009 R$ 70,00
0303 Noel Costa 01/12/2009 R$ 70,00
0303 Noel Costa 01/01/2010 R$ 70,00
(...) (...) (...) (...)
Eu quero saber se tem alguma condição que eu coloque para pegar apenas os que aparecem 1, 2, ou 3 vezes no resultado final da minha consulta. Por exemplo, pegar somente os beneficiários com uma parcela em aberto (no caso, o beneficiário Diego Ribeiro).
Diego
Curtidas 0
Respostas
Emerson Nascimento
13/01/2010
deve ser algo assim:
select codigo, nome, max(vencimento) vencimento, max(valor) valor
from tabela
group by codigo, nome
having count(codigo) = 1
select codigo, nome, max(vencimento) vencimento, max(valor) valor
from tabela
group by codigo, nome
having count(codigo) = 1
GOSTEI 0
Diego
13/01/2010
Emerson, se eu fizer isso ele só vai pegar uma linha de cada beneficiário, que é aquela que tiver com a maior data.
Entenda o que eu quero:
Para os beneficiários que tem somente 1 ou 2 parcelas em aberto, eu mando uma carta de notificação de inadimplência. Para os que tem 3 ou mais, eu mando uma carta de cancelamento. No caso do exemplo que eu demonstrei, os beneficiários Mariano e Diego devem receber carta de notificação e Noel deve receber uma carta de cancelamento. O que quero é saber como faço para separar esses grupos, dos que tem 1 ou 2 parcelas em aberto e dos que tem 3 ou mais parcelas.
Não sei se ficou meio confusa a explicação, qualuer coisa eu tento explicar de uma forma diferente...
Entenda o que eu quero:
Para os beneficiários que tem somente 1 ou 2 parcelas em aberto, eu mando uma carta de notificação de inadimplência. Para os que tem 3 ou mais, eu mando uma carta de cancelamento. No caso do exemplo que eu demonstrei, os beneficiários Mariano e Diego devem receber carta de notificação e Noel deve receber uma carta de cancelamento. O que quero é saber como faço para separar esses grupos, dos que tem 1 ou 2 parcelas em aberto e dos que tem 3 ou mais parcelas.
Não sei se ficou meio confusa a explicação, qualuer coisa eu tento explicar de uma forma diferente...
GOSTEI 0
Emerson Nascimento
13/01/2010
a instrução passada foi somente pra você ter uma idéia de como fazer.
não sei quais colunas você quer como retorno, então vou retornar somente o código e o nome.
select
codigo, nome,
(case when count(codigo) > 2 then 'Cancelamento' else 'Notificação' end) carta
from
tabela
group by
codigo, nome
não sei quais colunas você quer como retorno, então vou retornar somente o código e o nome.
select
codigo, nome,
(case when count(codigo) > 2 then 'Cancelamento' else 'Notificação' end) carta
from
tabela
group by
codigo, nome
GOSTEI 0
Diego
13/01/2010
Bom, é o seguinte: Eu quero saber quais os beneficiários que estão com alguma parcela em aberto. Quando ele paga a mensalidade, a tupla da mensalidade paga recebe um marcador que identifica o pagamento.
Meu codigo é o seguinte:
Select Distinct Codigo, Nome, DataVencimento, ValorLiquido
From Cliente
Where Situacao = 1 /* 1 - Aberto / 2 - Quitado */
And DataVencimento < GetDate()
Aí ele vai me retornar aquilo que eu mandei na primeira resposta. O que eu quero é saber é qual condição utilizar para que o script mostre somente as ocorrências que aparecem x vezes, sendo x um valor definido por mim. Por exemplo, para que o script mostre somente as ocorrências dos beneficiários que apareçam 3 ou mais vezes na consulta final, no caso do exemplo ele mostraria somente as tuplas de Noel Costa, pois ele aparece 3 vezes. Eu não posso agrupar pelo código e pelo nome porque eu quero que apareçam cada vencimento e cada valor no determinado vencimento.
Te agradeço muito desde já pela rapidez nas respostas e pela atenção que vc tem disponibilizado.
Meu codigo é o seguinte:
Select Distinct Codigo, Nome, DataVencimento, ValorLiquido
From Cliente
Where Situacao = 1 /* 1 - Aberto / 2 - Quitado */
And DataVencimento < GetDate()
Aí ele vai me retornar aquilo que eu mandei na primeira resposta. O que eu quero é saber é qual condição utilizar para que o script mostre somente as ocorrências que aparecem x vezes, sendo x um valor definido por mim. Por exemplo, para que o script mostre somente as ocorrências dos beneficiários que apareçam 3 ou mais vezes na consulta final, no caso do exemplo ele mostraria somente as tuplas de Noel Costa, pois ele aparece 3 vezes. Eu não posso agrupar pelo código e pelo nome porque eu quero que apareçam cada vencimento e cada valor no determinado vencimento.
Te agradeço muito desde já pela rapidez nas respostas e pela atenção que vc tem disponibilizado.
GOSTEI 0
Emerson Nascimento
13/01/2010
veja se assim atende a sua necessidade:
Select C1.Codigo, C1.Nome, C1.DataVencimento, C1.ValorLiquido
From Cliente C1
Where C1.Situacao = 1 And C1.DataVencimento < GetDate()
And C1.Codigo =
(
Select C2.Codigo
From Cliente C2
Where C2.Situacao = C1.Situacao
And C2.Codigo = C1.Codigo
And C2.DataVencimento < GetDate()
Group by C2.Codigo
Having Sum(C2.Codigo) > 2
)
No exemplo acima, seriam exibidos aqueles que têm 3 ou mais parcelas em aberto.
Select C1.Codigo, C1.Nome, C1.DataVencimento, C1.ValorLiquido
From Cliente C1
Where C1.Situacao = 1 And C1.DataVencimento < GetDate()
And C1.Codigo =
(
Select C2.Codigo
From Cliente C2
Where C2.Situacao = C1.Situacao
And C2.Codigo = C1.Codigo
And C2.DataVencimento < GetDate()
Group by C2.Codigo
Having Sum(C2.Codigo) > 2
)
No exemplo acima, seriam exibidos aqueles que têm 3 ou mais parcelas em aberto.
GOSTEI 0
Diego
13/01/2010
Perfeito cara, era exatamente isso que eu queria. Muito obrigado mesmo, me adiantou em 300% pois eu fazia essa filtragem manualmente todos os meses em mais de 3.000 beneficiários. Agora eu já imprimo separadamente, dependendo da situação onde o mesmo se encontra.
GOSTEI 0