Array
(
)

Dúvida em como agrupar alguns dados

Diego
   - 13 jan 2010

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).

Emerson
   - 14 jan 2010

deve ser algo assim:

select codigo, nome, max(vencimento) vencimento, max(valor) valor
from tabela
group by codigo, nome
having count(codigo) = 1

0
|
0

Diego
   - 14 jan 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...

0
|
0

Emerson
   - 14 jan 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

0
|
0

Diego
   - 14 jan 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.

0
|
0

Emerson
   - 14 jan 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.

0
|
0

Diego
   - 20 jan 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. 

0
|
0