Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Consulta Sql de 2 tablas

Estas en el tema de Consulta Sql de 2 tablas en el foro de Mysql en Foros del Web. Hola Amigos, tengo la siguiente consulta que me funciona bien agrupando por meses mis ventas, cmv, etc. Lo que quiero es agregar a esta consulta ...
  #1 (permalink)  
Antiguo 06/10/2010, 14:52
Avatar de Pablus00  
Fecha de Ingreso: diciembre-2003
Ubicación: A un click de distancia
Mensajes: 1.044
Antigüedad: 20 años, 4 meses
Puntos: 11
Consulta Sql de 2 tablas

Hola Amigos, tengo la siguiente consulta que me funciona bien agrupando por meses mis ventas, cmv, etc. Lo que quiero es agregar a esta consulta un campo de otra tabla, llamada "Gastos Fijos" para que me sume el gasto de monotributo mensual.

SELECT Month(fecha) & '/' & Year(fecha) AS Fecha, Sum(Ventas.Ventas) AS [Ventas Mensuales], Sum(Ventas.CMV) AS CMV, Sum(Ventas.Ventas)- Sum(Ventas.CMV) AS [MARGEN DE CONTRIBUCION]
FROM Ventas
GROUP BY Month(fecha), Year(fecha)
HAVING (((Month([fecha])) Between 1 And 12) AND ((Year([fecha]))=2010));



Esta tabla de gastos tambien tiene un campo llamado "Fecha" y al intentar incluir algo asi: (me dice que el campo fecha esta repetido en las 2 tablas, y si lo renombro me da cualquier calculo)

SELECT Month(fecha) & '/' & Year(fecha) AS Fecha, Sum(Ventas.Ventas) AS [Ventas Mensuales], Sum(Ventas.CMV) AS CMV, Sum(Ventas.Ventas)- Sum(Ventas.CMV) AS [MARGEN DE CONTRIBUCION], sum([Gastos Fijos].Monotributo AS Monotributo,
FROM Ventas, [Gastos Fijos]
GROUP BY Month(fecha), Year(fecha)
HAVING (((Month([fecha])) Between 1 And 12) AND ((Year([fecha]))=2010));


No se como agregarlo, alguna idea?
__________________
-- Nunca te des por vencido, aún vencido -- Web
  #2 (permalink)  
Antiguo 07/10/2010, 07:13
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Consulta Sql de 2 tablas

Debes indicar en cada aparición del campo fecha a que tabla te refieres, Sql no puede distinguir entre dos campos que se llaman igual de dos tablas si no le dices cual es cual


SELECT Month(V.fecha) & '/' & Year(V.fecha) AS Fecha, Sum(V.Ventas) AS [Ventas Mensuales], Sum(V.CMV) AS CMV, Sum(V.Ventas)- Sum(V.CMV) AS [MARGEN DE CONTRIBUCION], sum(GF.Monotributo AS Monotributo,
FROM Ventas as V, [Gastos Fijos] as GF
GROUP BY Month(V.fecha), Year(V.fecha)
HAVING (((Month(V.fecha)) Between 1 And 12) AND ((Year(V.fecha))=2010));

He supuesto que todas las que muestras vienen de ventas....

No he analizado si la consulta funciona....

Quim


Esto tiene algun sentido

Month(V.fecha)) Between 1 And 12

hay fechas con MONTH que no este entre 1 y 12?
  #3 (permalink)  
Antiguo 07/10/2010, 15:59
Avatar de Pablus00  
Fecha de Ingreso: diciembre-2003
Ubicación: A un click de distancia
Mensajes: 1.044
Antigüedad: 20 años, 4 meses
Puntos: 11
Respuesta: Consulta Sql de 2 tablas

Hola Quimfv, gracias por responder, al parecer tiene algun error de sintaxis la consulta, pasandolo sin abreviar, asi:

SELECT Month(Ventas.Fecha) & '/' & Year(Ventas.Fecha) AS Fecha, Sum(Ventas.Ventas) AS [Ventas Mensuales], Sum(Ventas.CMV) AS CMV, Sum(Ventas.Ventas)-Sum(Ventas.CMV) AS [MARGEN DE CONTRIBUCION], sum([Gastos Fijos].Monotributo)
FROM Ventas, [Gastos Fijos]
GROUP BY Month(Ventas.Fecha), Year(Ventas.Fecha)
HAVING (((Month([Ventas.Fecha])) Between 1 And 12) AND ((Year([Ventas.Fecha]))=2010));


Si bien funciona, me arroja cualquier resultado, en vez de agruparme el gasto de monotributo tambien por mes, he echo pruebas asi:

SELECT Month(Ventas.Fecha) & '/' & Year(Ventas.Fecha) AS Fecha, Sum(Ventas.Ventas) AS [Ventas Mensuales], Sum(Ventas.CMV) AS CMV, Sum(Ventas.Ventas)-Sum(Ventas.CMV) AS [MARGEN DE CONTRIBUCION], sum(Gastos_Fijos.Monotributo) AS Monotributo
FROM Ventas, Gastos_Fijos
GROUP BY Month(Ventas.Fecha), Year(Ventas.Fecha), Month(Gastos_Fijos.Fecha), Year(Gastos_Fijos.Fecha)


te paso un link para que veas la base de datos de ejemplo, con 2 tablas y algunos registros de prueba a ver si logras hacerlo andar.. muchas gracias

http://www.megaupload.com/?d=F2EL4GNJ
__________________
-- Nunca te des por vencido, aún vencido -- Web
  #4 (permalink)  
Antiguo 07/10/2010, 16:02
Avatar de Pablus00  
Fecha de Ingreso: diciembre-2003
Ubicación: A un click de distancia
Mensajes: 1.044
Antigüedad: 20 años, 4 meses
Puntos: 11
Respuesta: Consulta Sql de 2 tablas

PD: el Month(V.fecha)) Between 1 And 12, estaba redundante, una vez terminada la consulta, le asignaria una variable para poder consultar rangos de meses determinados, pero de momento estaria sobrando
__________________
-- Nunca te des por vencido, aún vencido -- Web
  #5 (permalink)  
Antiguo 08/10/2010, 04:22
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Consulta Sql de 2 tablas

Interpretando lo que quieres hacer...

Debes vincular las tablas por MesAño no por fecha, ese dato no lo tenemos directamente en las tablas originales por lo que debemos hacer sub-consultas para tenerlo y luego vincular por ese nuevo campo

Código SQL:
Ver original
  1. SELECT MONTH(sbcVentas.fecha) & '/' & YEAR(sbcVentas.fecha) AS Fecha,
  2.              SUM(sbcVentas.Ventas) AS [Ventas Mensuales],
  3.              SUM(sbcVentas.CMV) AS CMV,
  4.              SUM(sbcVentas.Ventas-sbcVentas.CMV) AS [MARGEN DE CONTRIBUCION],
  5.              SUM(sbcGastos.Monotributo) AS MonotributoMensual
  6. FROM (SELECT MONTH([Ventas].[fecha]) & '/' & YEAR([Ventas].[fecha]) AS MesAño,
  7.                         Ventas.idCliente,
  8.                         Ventas.idPedido,
  9.                         Ventas.Fecha,
  10.                         Ventas.Ventas,
  11.                         Ventas.Descuento,
  12.                         Ventas.Utilidad,
  13.                         Ventas.CMV,
  14.                         Ventas.idEnvio,
  15.                         Ventas.info_Adicional
  16.              FROM Ventas) AS sbcVentas
  17. LEFT JOIN
  18.            (SELECT MONTH([Gastos_Fijos].[fecha]) & '/' & YEAR([Gastos_Fijos].[fecha]) AS MesAño,
  19.                          Gastos_Fijos.Fecha,
  20.                          Gastos_Fijos.Descripcion,
  21.                          Gastos_Fijos.Monotributo,
  22.                          Gastos_Fijos.IIBB,
  23.                          Gastos_Fijos.Personal,
  24.                          Gastos_Fijos.Alquiler,
  25.                          Gastos_Fijos.Inversiones,
  26.                          Gastos_Fijos.Publicidad,
  27.                          Gastos_Fijos.Luz,
  28.                          Gastos_Fijos.Gas,
  29.                          Gastos_Fijos.[Telefono + Internet],
  30.                          Gastos_Fijos.Agua,
  31.                          Gastos_Fijos.ABL,
  32.                          Gastos_Fijos.Limpieza,
  33.                          Gastos_Fijos.[Gastos Varios],
  34.                          Gastos_Fijos.Perdidas
  35.                  FROM Gastos_Fijos) AS sbcGastos
  36. ON sbcVentas.MesAño = sbcGastos.MesAño
  37. WHERE (((MONTH(sbcVentas.fecha)) BETWEEN 1 AND 12) AND ((YEAR(sbcVentas.fecha))=2010))
  38. GROUP BY MONTH(sbcVentas.fecha) & '/' & YEAR(sbcVentas.fecha);

Segunda opción más simple pero acces no sabe representarlo en el asistente de consultas, apesar de saber resolverlo

Código SQL:
Ver original
  1. SELECT MONTH(Ventas.fecha) & '/' & YEAR(Ventas.fecha) AS Fecha,
  2.              SUM(Ventas.Ventas) AS [Ventas Mensuales],
  3.              SUM(Ventas.CMV) AS CMV,
  4.              SUM(Ventas.Ventas-Ventas.CMV) AS [MARGEN DE CONTRIBUCION],
  5.             SUM(Gastos_Fijos.Monotributo) AS MonotributoMensual
  6. FROM  JOIN Ventas LEFT Gastos_Fijos
  7. ON MONTH([ventas].[fecha]) & '/' & YEAR([ventas].[fecha])=MONTH([Gastos_Fijos].[fecha]) & '/' & YEAR([Gastos_Fijos].[fecha])
  8. WHERE (((MONTH(Ventas.fecha)) BETWEEN 1 AND 12) AND ((YEAR(Ventas.fecha))=2010))
  9. GROUP BY MONTH(Ventas.fecha) & '/' & YEAR(Ventas.fecha);

No se si es muy correcto u ortodoxo vincular por campos calculados de esta forma. Que access no sepa representarlo en el asistente no seria un dato a terner en cuenta...

No conozco tu negocio por lo que no se si esto es lo que quieres...

Así, si un mes hay ventas pero no gastos saldran las ventas (LEFT JOIN), pero si un mes hay gastos pero no ventas los gastos no saldran

LEFT JOIN Todas las ventas con us gastos
RIGHT JOIN Todos los gastos con sus ventas
INNER JOIN Solo las ventas que tengan gastos

Si se puede dar la situacion de gastos sin ventas dimelo tambien tiene solución... si monotributo es algo parecido al IVA no se dará....

Quim

Última edición por quimfv; 08/10/2010 a las 04:39
  #6 (permalink)  
Antiguo 08/10/2010, 14:29
Avatar de Pablus00  
Fecha de Ingreso: diciembre-2003
Ubicación: A un click de distancia
Mensajes: 1.044
Antigüedad: 20 años, 4 meses
Puntos: 11
Respuesta: Consulta Sql de 2 tablas

Muchas gracias por tu tiempo Quimfv, te pongo un 100 de karma!
Te cuento que el impuesto monotributo es un impuesto fijo mensual como el telefono, etc, el cual tiene un valor unico por mes.

El unico detalle que me falta es: Si tengo mas de una venta (como suele pasar) el valor del monotributo me lo suma la cantidad de registros de ventas que haya tenido

si tengo 5 ventas, y el monotributo es 4 me pone 20 de valor. Habra una manera de que solo me ponga 4? mi cabeza esta desde la mañana haciendo pruebas y no lo saco. Saludos
__________________
-- Nunca te des por vencido, aún vencido -- Web
  #7 (permalink)  
Antiguo 13/10/2010, 04:42
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Consulta Sql de 2 tablas

En este caso hay que repalntearlo todo...

Código SQL:
Ver original
  1. SELECT MONTH(Ventas.fecha) & '/' & YEAR(Ventas.fecha) AS Fecha,
  2.              SUM(Ventas.ventas) AS [Ventas Mensuales],
  3.              SUM(Ventas.cmv) AS CMV,
  4.              SUM(Ventas.Ventas-Ventas.CMV) AS [MARGEN DE CONTRIBUCION],
  5.              (SELECT Gf.Monotributo
  6.                   FROM Gastos_fijos Gf
  7.                   WHERE
  8.                       (((MONTH(Gf.[fecha]) & '/' & YEAR(Gf.[fecha]))=MONTH([Ventas].[fecha]) & '/' & YEAR([Ventas].[fecha])))) AS MonotributoMensual
  9.      FROM Ventas
  10.          WHERE (((MONTH([Ventas].[fecha])) BETWEEN 1 AND 12)
  11.               AND ((YEAR([Ventas].[fecha]))=2010))
  12.      GROUP BY MONTH(Ventas.fecha) & '/' & YEAR(Ventas.fecha);

siendo gastos fijos quizas seria mejor trabajarlo a parte una consulta para cada cosa... pero bueno eso te da lo que buscas siempre que no tengas dos registros de un mes determinado en la tabla gastos_fijos, puesto que si la subconsulta retorna mas de un registro dará error.

Si tienes varios registros puedes sumarlos para obtener uno solo, si MonoTributo solo tiene valor en un registro te dará igual

Código SQL:
Ver original
  1. Fecha          Monotributo  Otros ...
  2. 1/1/2010            4              0
  3. 5/1/2010            0              5

Si substituyes la subconsulta por

Código SQL:
Ver original
  1. SELECT SUM(Gf.Monotributo) AS SumaDeMonotributo
  2. FROM Gastos_fijos Gf
  3. GROUP BY MONTH(Gf.[fecha]) & '/' & YEAR(Gf.[fecha])
  4. HAVING (((MONTH(Gf.[fecha]) & '/' & YEAR(Gf.[fecha]))=MONTH([Ventas].[fecha]) & '/' & YEAR([Ventas].[fecha])))

tambien te funcionará con diversos registros....

Quim

Última edición por quimfv; 13/10/2010 a las 07:07
  #8 (permalink)  
Antiguo 20/10/2010, 14:22
Avatar de Pablus00  
Fecha de Ingreso: diciembre-2003
Ubicación: A un click de distancia
Mensajes: 1.044
Antigüedad: 20 años, 4 meses
Puntos: 11
Respuesta: Consulta Sql de 2 tablas

Muchas gracias Quim, te pasaste ;)
__________________
-- Nunca te des por vencido, aún vencido -- Web

Etiquetas: sql, tablas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:35.