SQL - Consulta anidada

   
Vista:

Consulta anidada

Publicado por Randall Rodriguez (5 intervenciones) el 23/10/2010 20:20:19
Necesito en una consulta ver en detalle de las ventas y calcular la comision para vendedores segun cada familia a la que pertenecen los productos y luedo cuado las facturas son de credito mostrar la informacion de el ultimo pago realizado. con la primera parte no hay problema el problema se da cuando intento sacar la info de los pagos ya que si hago un inner join con la tabla de cuentas por cobrar (ahi se guardan todos los movimientos como, creditos, debitos, pagos, facturas) en tonces si una factura tiene mas de un pago me duplica/triplica los registros del detalle de cada factura por lo que habia intentado sacarlo con una subconsulta pero me encontre con el problema de que una subconsulta solo puede devolver un registro unico acontinuacion voy a mostrar el codigo del sql y luego lo que este muestra.

SELECT Personal.NomEmpleado AS Vendedor, MaFacturas.NumFactura, Convert(varchar,MaFacturas.FecFactura,103) AS Fecha,
MaFacturas.CodCliente, DeFacturas.CodArticulo, DeFacturas.Cantidad, DeFacturas.Precio,
AsignaComision.Comiision AS '% Comision',
(SELECT convert(varchar,FecDocumento, 103) + ' '+ 'Pago: ' +convert(varchar,CxCMaDocumP.NumDocumento)+' Monto: '+convert(varchar,MontoDocumento)
FROM MaFacturas INNER JOIN
CxCMaDocumP ON MaFacturas.NumDocumento = CxCMaDocumP.DocAfecta
WHERE DocAfecta IN (2299,2031) AND TipoMovimiento='P'
order by FecDocumento desc) AS Pago
FROM MaFacturas INNER JOIN
DeFacturas ON MaFacturas.NumFactura = DeFacturas.NumFactura INNER JOIN
Personal ON MaFacturas.CodVendedor = Personal.CodEmpleado FULL OUTER JOIN
Clases INNER JOIN
Articulos ON Clases.CodClase = Articulos.CodClase INNER JOIN
AsignaComision ON Articulos.CodClase = AsignaComision.CodClase ON Personal.CodEmpleado = AsignaComision.CodEmpleado AND
DeFacturas.CodArticulo = Articulos.CodArticulo
WHERE MaFacturas.NumDocumento IN (2299,2031)

Vendedor Factura FecFactura Cod Cant. precio % Comision Info del pago

Flor Idilia Vindas 2047 02/08/2008 MD440ICH 1 4425 1 06/09/2008 Pago: 839 Monto: 4302

Flor Idilia Vindas 2047 02/08/2008 A01-612K 1 3540 1 06/09/2008 Pago: 839 Monto: 4302

Flor Idilia Vindas 2047 02/08/2008 NJ538 2 797 1 06/09/2008 Pago: 839 Monto: 4302

Flor Idilia Vindas 2047 02/08/2008 A02-663K 1 3097,34 1 06/09/2008 Pago: 839 Monto: 4302

Juan Flores 2315 06/08/2008 0005 1 90000 1 06/09/2008 Pago: 839 Monto: 4302

Juan Flores 2315 06/08/2008 L4963 3 1884,17 1 06/09/2008 Pago: 839 Monto: 4302

como se puede ver la informacion del pago (Pago: 839 Monto: 4302) se repite para todos las facturas en este caso solo son dos facturas pero unque sean mas simpre va aprecer la misma info del pago lo que no puedo hacer es que aparesca para cada factura la informacion del pago respectivo, si alguien tiene alguna idea de como se pueda hacer le agrecere su ayuda,
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Consulta anidada

Publicado por Leonardo Josué (877 intervenciones) el 25/10/2010 19:12:32
Buenos días Randall Rodriguez:

Me resultó muy complicado entender la consulta que estás realizando, sería más fácil si en lugar de poner el resultado de la consulta (que según comentas está incorrecto) pones los datos en cada una de las tablas que manejas por separado y nos muestras qué es lo que esperas de salida.

También te pediría que menciones qué Manejador de BD estás utilizando para dar con la sintaxis correcta.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Consulta anidada

Publicado por Randall Rodriguez (5 intervenciones) el 26/10/2010 07:29:15
(no encontre otra manera de adjuntar las tablas)
Esta es la tabla ddonde se guardan todos los movientos de CxC:

Tipo IDMov NumDoc IdDoc MontoDoc FecDoc TipAfecta DocAfecta
F 168 2299 2315 96387 06/08/2008 F 2299
F 232 2031 2047 14302 02/08/2008 F 2031
C 304 175 0 40000 22/08/2008 F 2299
P 340 781 0 15000 22/08/2008 F 2299
P 341 780 0 20000 22/08/2008 F 2299
P 353 787 0 10000 23/08/2008 F 2031
P 521 819 0 21387 03/09/2008 F 2299
P 583 839 0 4302 06/09/2008 F 2031

Luego adjunto lo que saca el SQL que mostre antes (sin la subconsulta) para no adjuntar todas las tablas que intervienen ya que son muchas, aqui lo que se muestra es basicamente el detale de las facturas en este caso filtrado para efectos de ejemplo para las facturas IN (2299, 2031), el nombre del vendedor, el porcentage de comision salen otra tabla, aqui lo que hace falta es la columna de la informacion del pago que es con lo que tengo problemas.

Vendedor Factura Fecha Codigo % Comision Monto
Juan Flores 2299 06/08/2008 0005 1 90000
Juan Flores 2299 06/08/2008 L4963 3 1884,17
Flor Idilia Vindas 2031 02/08/2008 MD440ICH 1 4425
Flor Idilia Vindas 2031 02/08/2008 A01-612K 1 3540
Flor Idilia Vindas 2031 02/08/2008 NJ538 2 797
Flor Idilia Vindas 2031 02/08/2008 A02-663K 1 3097,34
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Consulta anidada

Publicado por Leonardo Josué (877 intervenciones) el 26/10/2010 19:37:30
Buenas Tardes Randall, estuve revisando tus post y creo que tienes un problema de conceptualización. el problema es que estás tratando de mezclaras tablas que tienen relación muchos a muchos o m-n.

Vayamos por partes. Por un lado están las facturas, cada factura tiene uno o más artículos lo que lo convierte en una relación 1 a n.

Por otro lado si la factura es de crédito entonces puede tener 1 o más pagos, lo que la convierte en una relación 1 a n.

Sin embargo tú estás tratando de alguna manera unir los detalles de la factura con los detalles de los pagos, que se convertiría en una relación m-n que resulta imposible de obtener.

Aquí tendrías que analizar bien cual es tu objetivo. Según lo que entendí lo que quieres obtener es cuál es la comisión que le tienes que entregar a un empleado POR FACTURA.

Lo que tendrías que hacer es entonces obtener la comisión de los detalles de la factura y hacer una sumatoria de tal manera que la relación entre facturas y detalles se convierta en una relación 1 a 1. por el lado de los pagos según entendí que deseas obtener el último de los pagos, por lo tanto la relación entre facturas y pagos también se convertiría en 1 a 1.

Lamentablemente los datos no me sirvieron de mucho como para poder probar alguna consulta, pero veamos si más o menos esto te sirve.

Supongamos que tu tabla facturas tiene lo siguiente
Vendedor|Factura|MontoTotal
Juan Flores|2299|3000
Flor Idilia Vindas|2031|2500

DetalleFacturas
Factura|Articulo|Precio|Comision
2299|Articulo 1|1000|100
2299|Articulo 2|2000|150
2031|Articulo 1|1000|100
2031|Articulo 3|1000|50
2031|Articulo 4|500|75

Por lo tanto, si queremos obtener qué comisión le toca a cada Vendedor a simple vista podemos determinar que a Juan Flores le corresponden 250 (100+150) y a Flor le corresponden 225 (100+50+75) esto podrías obtenerlo así

select f.vendedor, f.factura, f.MontoTotal, d.comision from Facturas f inner join
(
select factura, sum(comision) as comision from DetalleFacturas group by factura
) d on d.factura = f.factura

La consulta te regresaría lo siguiente
Vendedor|Factura|MontoTotal|Comision
Juan Flores|2299|3000|250
Flor Idilia Vindas|2031|2500|225

Espero que te pueda servir de algo esto

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Consulta anidada

Publicado por Randall Rodriguez (5 intervenciones) el 27/10/2010 02:47:37
Gracias Leonardo, si yo se que tengo el problema que mencionas, se que se puede hacer como tu dices el problema es que el cliente quiere ver el desglose de cada factura ya que tal vez algo que no te explique es que el calculo de comision es por articulo segun a la familia que pertenezca ejemplo: articulo codigo XX pertenece a la familia YY entonces la formula es precio * cantidad * % camision (esta comision varia segun a la familia a la que pertenece el producto, xq otra de las tablas que intervienen aca es una tabla en donde aparecen todas las familias con su respectivo porcentage de comision) por eso no se puede hacer el sum.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Consulta anidada

Publicado por Leonardo Josué (877 intervenciones) el 27/10/2010 16:12:09
Entendí desde un inicio la parte en que las comisiones variaban de acuerdo a cada producto, de hecho si pones un poco de atención en el ejemplo que puse está esto

Factura|Articulo|Precio|Comision
2031|Articulo 1|1000|100
2031|Articulo 3|1000|50

Es decir, aunque el precio del artículo es el mismo para ambos registros manejo una comisión distinta, aquí aparece fijo pero en tu caso se obtendría la comisión a partir de tus otras tablas, es decir, ir por partes primero a partir del detalle de las facturas obtener la comisión que le pertenece por cada artículo. Una vez que obtengas esto entonces si aplicar la sumatoria, pero bueno, tal parece que no es lo que esperas.

Sólo me resta recordarte que no todo lo que piden los clientes es factible de realizarse. Es responsabilidad del programador determinar qué se puede y qué no se puede hacer, así como mostrar alternativas a lo que pide el cliente. Lamento mucho no poder ayudarte y espero que alguien más lo pueda hacer.

Saludos.
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Consulta anidada

Publicado por Randall Rodriguez (5 intervenciones) el 27/10/2010 20:58:56
Si, Leo la verdad no se si esto sera posible de hacer por medio de SQL server, se que si se puede hacer pero progamando/realizando una aplicacion para esto (yo no soy programador) por que ellos actualmente tienen una aplicacion para el calculo de comisiones lo que pasa es que hay ciertas cosas en donde esta aplicacion se queda corto por eso yo estube elaborando ciertas tareas que harian lo que el programa no puede hacer pero me quede pegado en esta parte.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Consulta anidada

Publicado por Randall Rodriguez (5 intervenciones) el 30/10/2010 06:37:14
Les cuento que resolvi el problema, lo que hice primero que nada fue quitar la subcosulta del SQL que saca todos los datos de las ventas luego meti los ultimos pagos a una tabla temporal y luego hice un inner join con esta tabla temporal y listo ya asi obtube la informacion del pago correspondiente a cada factura, muchas gracias a Leonardo por su ayuda y por su interes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar