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

Preguntas similare

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



Respuesta Responder a este mensaje
#2 Marcelo Clavero
15/09/2005 - 23:40 | Informe spam
Alejandro,

debés estar harto de que te feliciten por resolver problemas de éstos, pero
harto o no
TE FELICITO igual y te agradezco de corazón.

De primera no me funcionó, pero una vez que entendí tu lógica, lo único que
debí hacer
fue cambiar una pequeñez en la parte que dice:

...
on contactos.id_asegurado = last_doc.id_asegurado
and contactos.id_doc = last_doc.max_id_doc
...
poniendo:
...
on contactos.id_asegurado = last_doc.id_asegurado
and documentos.id_doc = last_doc.max_id_doc
...
pues id_doc no es un campo de Contactos.

y listo, funcionó.

Luego hasta me di el placer de poner como left outer el último inner para
que me muestre también los clientes que puedan tener documentos sin vendedor
asignado, y el reporte quedó de rechupete. Meter subconsultas en los inners
ta bárbaro, aunque todavía me cuesta razonarlo a solas.

Imponente este NG.
Gracias y saludos.
Marcelo


"Alejandro Mesa" escribió en el
mensaje news:
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
>
>
>
Respuesta Responder a este mensaje
#3 Alejandro Mesa
19/09/2005 - 17:55 | Informe spam
Marcelo,

Me alegra mucho que te haya servido, pero mas aun, que hayas entendido la
logica y haber podido corregir el error.


AMB

"Marcelo Clavero" wrote:

Alejandro,

debés estar harto de que te feliciten por resolver problemas de éstos, pero
harto o no
TE FELICITO igual y te agradezco de corazón.

De primera no me funcionó, pero una vez que entendí tu lógica, lo único que
debí hacer
fue cambiar una pequeñez en la parte que dice:


on contactos.id_asegurado = last_doc.id_asegurado
and contactos.id_doc = last_doc.max_id_doc

poniendo:

on contactos.id_asegurado = last_doc.id_asegurado
and documentos.id_doc = last_doc.max_id_doc

pues id_doc no es un campo de Contactos.

y listo, funcionó.

Luego hasta me di el placer de poner como left outer el último inner para
que me muestre también los clientes que puedan tener documentos sin vendedor
asignado, y el reporte quedó de rechupete. Meter subconsultas en los inners
ta bárbaro, aunque todavía me cuesta razonarlo a solas.

Imponente este NG.
Gracias y saludos.
Marcelo


"Alejandro Mesa" escribió en el
mensaje news:
> 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
> >
> >
> >



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida