Una consulta media complicada....(al menos para mi).

15/09/2005 - 22:25 por Marcelo Clavero | Informe spam
Genios...muy buenas a todos.
Tengo que resolver lo siguiente.

Tabla 1: Contactos
id_contacto - int
nombre - varchar(100)

Tabla 2: Documentos
id_doc - int
id_cartera - smallint
fecha - smalldatetime
id_contacto - int
id_vendedor - int

Los Contactos son personas (clientes) que generan Documentos y se vinculan
por el id_contacto.
Los documentos siempre tienen una cartera (rubro), una fecha y un contacto.
Además pueden tener cero o 1 vendedor (sin vendedor se considera venta
directa, y se deja el campo id_vendedor en cero). Ese vendedor (de existir),
también es una persona de la tabla Contactos, y no tiene porque ser el mismo
para distintos documentos de un mismo contacto. (O sea que un cliente puede
tener varios documentos con distintos vendedores).

Para una cartera dada, necesito un reporte que tenga solo una fila por cada
contacto mostrando la fecha del último documento emitido, y si tiene
vendedor, cual fue el vendedor de ese último documento. No me debería
aparecer más de una fila por contacto.

Lo más cerca que llegué fue a:

select distinct contactos.nombre, max(documentos.fecha) as ultimo,
contactos1.nombre
from contactos
inner join documentos on contactos.id_contacto=documentos.id_asegurado
inner join contactos contactos1 on
contactos1.id_contacto=documentos.id_vendedor
where documentos.id_cartera=1
group by contactos.nombre,contactos1.nombre
order by contactos.nombre

Pero si hay un contacto que tuvo varios documentos vendidos por diferentes
vendedores, esto ya no funciona, pues muestra más de una fila por contacto.

Espero que hayan entendido el planteo.

Bueno, estoy en vuestras manos.
Mientras seguiré probando, quizás alguna subconsulta, pero no tengo aun
suficiente experiencia en esto.

Gracias desde ya,
y vayan mis respetos.

Marcelo
 

Leer las respuestas

#1 Alejandro Mesa
15/09/2005 - 22:51 | Informe spam
Trata:

select
contactos.nombre,
documentos.fecha as ultimo,
contactos1.nombre
from
contactos
inner join
documentos
on contactos.id_contacto = documentos.id_asegurado
inner join
(
select
a.id_asegurado,
max(a.id_doc) as max_id_doc
from
documentos as a
inner join
(
select
id_asegurado,
max(fecha) as max_fecha
from
documentos
group by
id_asegurado
) as b
on a.id_asegurado = b.id_asegurado and a.fecha = b.max_fecha
group by
a.id_asegurado
) as last_doc
on contactos.id_asegurado = last_doc.id_asegurado
and contactos.id_doc = last_doc.max_id_doc
inner join
contactos contactos1
on contactos1.id_contacto = documentos.id_vendedor
where
documentos.id_cartera=1
order by
contactos.nombre
go


AMB

"Marcelo Clavero" wrote:

Genios...muy buenas a todos.
Tengo que resolver lo siguiente.

Tabla 1: Contactos
id_contacto - int
nombre - varchar(100)

Tabla 2: Documentos
id_doc - int
id_cartera - smallint
fecha - smalldatetime
id_contacto - int
id_vendedor - int

Los Contactos son personas (clientes) que generan Documentos y se vinculan
por el id_contacto.
Los documentos siempre tienen una cartera (rubro), una fecha y un contacto.
Además pueden tener cero o 1 vendedor (sin vendedor se considera venta
directa, y se deja el campo id_vendedor en cero). Ese vendedor (de existir),
también es una persona de la tabla Contactos, y no tiene porque ser el mismo
para distintos documentos de un mismo contacto. (O sea que un cliente puede
tener varios documentos con distintos vendedores).

Para una cartera dada, necesito un reporte que tenga solo una fila por cada
contacto mostrando la fecha del último documento emitido, y si tiene
vendedor, cual fue el vendedor de ese último documento. No me debería
aparecer más de una fila por contacto.

Lo más cerca que llegué fue a:

select distinct contactos.nombre, max(documentos.fecha) as ultimo,
contactos1.nombre
from contactos
inner join documentos on contactos.id_contacto=documentos.id_asegurado
inner join contactos contactos1 on
contactos1.id_contacto=documentos.id_vendedor
where documentos.id_cartera=1
group by contactos.nombre,contactos1.nombre
order by contactos.nombre

Pero si hay un contacto que tuvo varios documentos vendidos por diferentes
vendedores, esto ya no funciona, pues muestra más de una fila por contacto.

Espero que hayan entendido el planteo.

Bueno, estoy en vuestras manos.
Mientras seguiré probando, quizás alguna subconsulta, pero no tengo aun
suficiente experiencia en esto.

Gracias desde ya,
y vayan mis respetos.

Marcelo



Preguntas similares