MySQL - Consula agrupada por meses de subselects

   
Vista:

Consula agrupada por meses de subselects

Publicado por Jesus (7 intervenciones) el 23/11/2017 11:18:03
Hola a todos, con ánimo de seguir aprendiendo y abusando de los conocimientos de los demás, solicito ayuda para resolver una consulta de la que no obtengo los resultados esperados.
Parto de dos tablas cabecerascompras y cabecerasventas ambas contienen la fecha y el total de cada compra y venta respectivamente. El resultado que quiero obtener es el siguiente:

consulta_mensual_compras_ventas
Para ello construyo la siguiente consulta:
SELECT S.Mes,SUM(S.Compras) Compras,SUM(S.Ventas) Ventas FROM
(
SELECT date_format(Fecha,'%m') Mes,SUM(Total) Compras,0 Ventas FROM cabecerascompras WHERE YEAR(Fecha)=2017 GROUP BY Month(Fecha)
UNION
SELECT date_format(Fecha,'%m') Mes,0 Compras,SUM(Total) Ventas FROM cabecerasventas WHERE YEAR(Fecha)=2017 GROUP BY Month(Fecha)
) S GROUP BY Mes

Los datos que me devuelve son correctos pero incompletos no se muestran los meses que no hubo movimientos Agosto (vacaciones) y Diciembre no llegamos.
select_mensual_compras_ventas
Me gustaría que salieran ambos meses con cero compras y ventas y si es posible los nombres de los meses en español. He intentado date_format(Fecha,'%M') Mes pero salen desordenados ya que April, March, etc alfabeticamente no se corresponden con 04 y 03 respectivamente.
Desde ya agradezco vuestra ayuda.
Saludos.
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

Consula agrupada por meses de subselects

Publicado por Rafael (70 intervenciones) el 23/11/2017 11:43:33
A ver prueba esta consulta ... en principio deberia funcionar.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[SELECT TMeses.Mes
     , TCompras.Compras
     , TVentas.Ventas
FROM   (SELECT 1 as IdMes , 'Enero'      as Mes UNION
        SELECT 2 as IdMes , 'Febrero'    as Mes UNION
        SELECT 3 as IdMes , 'Marzo'      as Mes UNION
        SELECT 4 as IdMes , 'Abril'      as Mes UNION
        SELECT 5 as IdMes , 'Mayo'       as Mes UNION
        SELECT 6 as IdMes , 'Junio'      as Mes UNION
        SELECT 7 as IdMes , 'Julio'      as Mes UNION
        SELECT 8 as IdMes , 'Agosto'     as Mes UNION
        SELECT 9 as IdMes , 'Septiembre' as Mes UNION
        SELECT 10 as IdMes, 'Octubre'    as Mes UNION
        SELECT 11 as IdMes, 'Noviembre'  as Mes UNION
        SELECT 12 as IdMes, 'Diciembre'  as Mes) TMeses
       LEFT JOIN (SELECT Month(Fecha) IdMes
                       , SUM(Total) Compras
                  FROM   cabecerascompras
                  WHERE  YEAR(Fecha)=2017
                  GROUP  BY Month(Fecha)) TCompras
              ON TMeses.IdMes = TCompras.IdMes
       LEFT JOIN (SELECT Month(Fecha) IdMes
                       , SUM(Total) Ventas
                  FROM   cabecerasventas
                  WHERE  YEAR(Fecha)=2017
                  GROUP  BY Month(Fecha)) TVentas
              ON TMeses.IdMes = TVentas.IdMes
ORDER BY TMeses.IdMes
Y cuentanos como te ha ido...

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

Consula agrupada por meses de subselects

Publicado por Jesus (7 intervenciones) el 23/11/2017 12:14:57
Bien!!, respuesta rapida y efectiva como MySQL. No se me hubiese ocurrido hacer uniones de los meses con sus indices para vincularlos con las tablas.
Perfecto! muchas gracias por enseñarnos.
Saludos..
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